본문 바로가기
Language/Java

Java에서 Javascript 사용하는 방법 (로그인/로그아웃 자바소스 예제포함)

by 나비와꽃기린 2018. 12. 11.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


자바에서 자바스크립트 실행하는 방법

(java에서 javascript 호출하기)



1. 왜 사용하려고 했는가 ??


로그아웃시 자바에서 자바스크립트 호출을 하고자 했다.

해당 소스는 아래와 같았다.




위 소스처럼 Service를 통해 가져온 결과값 result를 통해

유효하지 않은 사용자임을 판별한 후, res 객체를 통해 화면을 return 하고

PrintWriter 클래스로 js alert를 띄우려고 했으나

PrintWriter 클래스를 사용하였을 때 

아래와 같은 Response 관련 Error가 났다.




java.lang.IllegalStateException: Response already committed






2. IllegalStateException Error 발생원인 


response 객체를 flush 하게 되면 close가 되어 commit이 된다.

sendredirect를 하면 또 한번 close commit이 발생하기 때문에

이미 commit 되었다는 에러메시지가 출력되는 것이다.

결국 sendRedirect 하기 전에 writer 객체를 건드리지 말고 바로 return 해주면 된다.







3. IllegalStateException Error 해결방법 과정




(1) writer 객체 flush()하고 close(); 

기존의 res 객체는 주석처리 해서 지운다.


 

(2) 앗..근데 추가적으로 다음과 같은 에러가 났다.

<BEA-101214> <Included resource or file "~~해당.jsp" not found from requested resource ".....




에러 내용을 봤더니

Spring Controller에서 ModelAndView return하고 있지 않았는데

return 형식을 HttpServletResponse로 주고 있었다.



(3) 따라서 아래 사진처럼

return 타입을 void로 변경 후 return res;를 없앴으며

소스 중간중간에서 res.sendRedirect를 하는 것으로 변경했다.



è  Spring에서 불필요한 view를 찾는 느낌..........









 4.  변경된 최종 소스 (로그인/로그아웃 자바소스)   ※ 참고하세요



(1) 로그인소스



@Controller
public class LoginController {

	private static final Logger logger = LoggerFactory.getLogger(LoginController.class);

	@Autowired
	private LoginService loginService; 
	
	@RequestMapping(value = "/portalLogin")
	public void getList(HttpServletRequest req, HttpServletResponse res) {
		
		DataEntity param = HttpUtil.getServletRequestParam(req); //제가 사용하는 공통Util입니다.. 파라미터받는

		try {
			
			String loginId = param.getString("loginId"); //로그인 유저,포탈에 있어야 한다
			String pwd = param.getString("pwd"); // CODE 값으로 대체하여 테스트
			System.out.println(loginId);
			System.out.println(pwd); 
			
			int result = loginService.getLoginResult(param); 
			
			System.out.println("========================"); 
			System.out.println(result); 
			System.out.println("========================="); 
			
			if(result==1){  //있는사용자 - 로그인
				
				Cookie cookie = new Cookie("SamplePerimeterAtnToken", "username="+loginId); //SSO 왔다 치고~
				cookie.setPath("/");
				cookie.setDomain("XX.XX.XX.XXX");
				res.addCookie(cookie);
				res.sendRedirect("http://XX.XX.XX.XXX:XXXX/webcenter/portal/Portal1");
				
			}else{ //없는사용자 - 로그아웃
				System.out.println("########LogOut#########");
		
				res.setContentType("text/html;charset=UTF-8");
				
				PrintWriter writer =res.getWriter();
				writer.println("");
				writer.flush();
				writer.close();
				
				//res.sendRedirect("http://XX.XX.XX.XXX:XXXX/portal/login.jsp");
				
			}
		
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		//return res;
	
	}



(2) 로그아웃소스




//포탈에서 로그아웃 버튼을 클릭했을 때
	@RequestMapping(value = "/portalLogout")
	public void portalLogout(HttpServletRequest req, HttpServletResponse res) {
		
		DataEntity param = HttpUtil.getServletRequestParam(req);

		try {
			
			Cookie[] cookies=req.getCookies();
			
			if(cookies != null){
				
				for(int i = 0; i < cookies.length; i++){
					
					String ckNm=cookies[i].getName();
					
					if(ckNm.equals("SamplePerimeterAtnToken") || ckNm.equals("LoginValidation")){ //|| ckNm.equals("PLTSSID")
						
						System.out.println(ckNm+"쿠키를삭제합니다");
					
						Cookie cookie1 = new Cookie(ckNm, null);
						cookie1.setPath("/");
						cookie1.setMaxAge(0);
						cookie1.setDomain("XX.XX.XX.XXX");
						res.addCookie(cookie1);
						
					}
				}
				
			}else{
				System.out.println("######   /portalLogout 로그아웃을 탔으며, 쿠키가 없다 #######");
			}
			
			res.sendRedirect("http://XX.XX.XX.XXX:XXXX/portal/login.jsp");
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		//return res;
	
	}
}