• Spring+Session+interceptor+ajax(拦截器)的登陆和退出


    方法一使用servlet自带的HttpSession

    注意点: HttpSession应该作为方法的参数

    //登入
    public boolean customerLogin(HttpSession httpSession) {     httpSession.setAttribute( "customer" , customer); }
    // 退出
    public String customerOut(HttpSession httpSession) { 
            
            httpSession.removeAttribute( "customer" );
               return "login" ; 
        }

    方法二:使用spring的@SessionAttributes("logincustomer")

    //登入
    @Controller @SessionAttributes(
    "logincustomer") public classCustomerController { publicJSONObject customerLogin(@RequestBody JSONObject json, ModelMap model,HttpServletResponse response) { model.addAttribute( "logincustomer" , logincustomer); } }
    // 退出  
    @RequestMapping(value = "customerout" )
          public String customerOut(SessionStatus sessionStatus) { 
            sessionStatus.setComplete(); // 只对@SessionAttributes("customer")有用,对HttpSession没用
              // 使用sessionStatus.setComplete( );会将所有的session全部清掉,
            return "login" ; 
        }

    拦截器(interceptor)

    注意:拦截器跟ajax结合用的话使用这条语句response.sendRedirect(request. getContextPath()+"/login.jsp");实现不了调转,要把结果传给前端,再在前端上实现跳转

    因此要判断请求是否是ajax请求

    package com.dessert.interceptor;
    
    import java.io.OutputStream;
      import java.io.PrintStream;
    
    import javax.servlet.ServletOutputStream;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import javax.servlet.http.HttpSession;
    
    import org.springframework.web.servlet.ModelAndView;
      import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
    
    public  class CommonInterceptor extends HandlerInterceptorAdapter {
          /* 
         *在拦截器中中有三个方法:
         * preHandler:在进入Handler方法之前执行了,使用于身份认证,身份授权,登陆校验等,比如身份认证,用户没有登陆,拦截不再向下执行,
         *返回值为false,即可实现拦截;否则,返回true时,拦截不进行执行; postHandler 
         * :进入Handler方法之后,返回ModelAndView之前执行,使用场景从ModelAndView参数出发,比如,将公用的模型数据在这里传入到视图,
         *也可以统一指定显示的视图等; afterHandler :在执行Handler完成后执行此方法,使用于统一的异常处理,统一的日志处理等;
         */ 
        @ Override 
        public  boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
                  throws Exception { 
             HttpSession session =request.getSession();
                  if (session.getAttribute("logincustomer") != null ) {
      //                 System.out.println(session.getAttribute("costomer")); 
                    return  true ; 
                } 
                // 如果是ajax请求,请求头会有x-requested-with  
                String requestWith = request.getHeader("x-requested-with" );
                  if (requestWith != null && requestWith.equalsIgnoreCase("XMLHttpRequest" )){
                      if (session.getAttribute("logincustomer") == null ) {
                          return  false ;
                    } else  if (session.getAttribute("logincustomer") != null ) {
                          return  true ; 
                    } 
                } else { 
                    response.sendRedirect(request. getContextPath() +"/login.jsp" ); 
                } 
                return  false ; 
        } 
    
        @Override 
        public  void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, 
                ModelAndView modelAndView) throws Exception { 
        } 
    
        @Override
        public  void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
                  throws Exception { 
        } 
    }

    springmvc中对拦截器的配置

    < mvc:interceptors > 
            < mvc:interceptor > 
                <!-- 匹配的是url路径,如果不配置或/**,将拦截所有的Controller --> 
                < mvc:mapping path ="/**"  /> 
                < !-- <mvc:exclude-mapping path="/index.jsp" /> --> 
                < mvc:exclude-mapping path ="/*login"  /> 
                < mvc:exclude-mapping path ="/forgotpwd"  / > 
                < mvc:exclude-mapping path ="/customerregister"  /> 
                < mvc:exclude-mapping path ="/vaildtel"  /> 
                <mvc:exclude-mapping path ="/css/**"  /> 
                < mvc:exclude-mapping path ="/js/**"  /> 
                < mvc:exclude-mapping path ="/myutil/**"  /> 
                < mvc:exclude- mapping path ="/images/**"  /> 
                <!-- <mvc:exclude-mapping path="/*.html" /> --> 
                < bean class ="com.dessert.interceptor .CommonInterceptor" > 
                < / bean > 
            </ mvc:interceptor > 
            <!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法-->
    </ mvc:interceptors >
  • 相关阅读:
    jdbc批量插入后返回批量id
    java 实现逻辑表达式解析
    jdbctemplate 批量插入 返回自增id
    谷歌浏览器 jsonVue 插件
    两个检查有无数据的sql语句
    Java
    Webview学习笔记 Hello
    调度器35—相关DEBUG汇总 Hello
    设计模式总结汇总 Hello
    kernel syscore 学习笔记 Hello
  • 原文地址:https://www.cnblogs.com/maggiejyt/p/7803155.html
Copyright © 2020-2023  润新知