SpringMVC 如何使用注解完成登录拦截
为了实现用户登录拦截你是否写过如下代码呢?
1.基于Filter
importjava.io.IOException; importjavax.servlet.Filter; importjavax.servlet.FilterChain; importjavax.servlet.FilterConfig; importjavax.servlet.ServletException; importjavax.servlet.ServletRequest; importjavax.servlet.ServletResponse; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpSession; publicclassAuthenticationFilterimplementsFilter{ privateFilterConfigfilterConfig; privateStringonErrorUrl; publicvoidinit(FilterConfigfilterConfig)throwsServletException{ //从filterConfig中的得到错误页 this.filterConfig=filterConfig; this.onErrorUrl=filterConfig.getInitParameter("onError"); if(this.onErrorUrl==null||"".equals(this.onErrorUrl)) this.onErrorUrl="onError"; } publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse, FilterChainchain)throwsIOException,ServletException{ HttpServletRequesthttpRequest=(HttpServletRequest)request; session=httpRequest.getSession(); if(null==session.getAttribute("_LOGIN_USER_")&&!"/login".equals(httpRequest.getServletPath())){ httpRequest.getRequestDispatcher("/"+this.onErrorUrl).forward(request,response); }else{ chain.doFilter(request,response); } } publicvoiddestroy(){ } }
2.基于Struts
importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importjavax.servlet.http.HttpSession; importorg.apache.struts2.ServletActionContext; importcom.opensymphony.xwork2.ActionInvocation; importcom.opensymphony.xwork2.interceptor.AbstractInterceptor; @SuppressWarnings("serial") publicclassLoginInterceptorextendsAbstractInterceptor{ @Override publicStringintercept(ActionInvocationinvocation)throwsException{ StringcurrentUser="currentUser"; HttpServletRequestrequest=ServletActionContext.getRequest(); HttpServletResponseresponse=ServletActionContext.getResponse(); HttpSessionsession=request.getSession(); if(request.getRequestURI().endsWith("login.action")){ returninvocation.invoke(); }else{ if(session.getAttribute(currentUser)!=null){ returninvocation.invoke(); }else{ response.sendRedirect(request.getContextPath()+"/login.jsp"); } } returnnull; } }
3.基于SpringMVC
importjavax.servlet.RequestDispatcher; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importorg.springframework.web.servlet.HandlerInterceptor; importorg.springframework.web.servlet.ModelAndView; importcn.edu.hdc.util.Constants; /** *@ClassName:LoginInterceptor *@Description:登录拦截器 *@authorloweirhbloweir@163.com *@date2016年4月27日上午8:06:11 */ publicclassLoginInterceptorimplementsHandlerInterceptor{ /** *在目标方法前被调用,返回true继续 */ @Override publicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objectobj)throwsException{ try{ Stringurl=request.getRequestURI(); //如果不是登录操作判断session if(!url.endsWith("login")){ if(request.getSession().getAttribute(Constants.CURRENT_USER)==null){ response.sendRedirect(request.getContextPath()+"/login.jsp"); returnfalse; } } } returntrue; }catch(Exceptione){ e.printStackTrace(); returnfalse; } } @Override publicvoidafterCompletion(HttpServletRequestarg0,HttpServletResponsearg1,Objectarg2,Exceptionarg3) throwsException{ } @Override publicvoidpostHandle(HttpServletRequestarg0,HttpServletResponsearg1,Objectarg2,ModelAndViewarg3) throwsException{ } }
如何使用自定义注解完成自定义拦截呢?
登录注解
importjava.lang.annotation.ElementType; importjava.lang.annotation.Retention; importjava.lang.annotation.RetentionPolicy; importjava.lang.annotation.Target; /** *Createdbyloweiron2017/5/1417:19 **author:张瑀楠 *email:hbloweir@163.com *负责登录拦截 */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE,ElementType.METHOD}) public@interfaceWebLoginRequired{ Stringvalue()default"";//未登录时需要跳转的路径 }
SpringMVC拦截器设置
importcom.ainsoft.globalshoperp.component.constant.WebLogin; importorg.apache.commons.lang3.StringUtils; importorg.apache.commons.logging.Log; importorg.apache.commons.logging.LogFactory; importorg.springframework.web.method.HandlerMethod; importorg.springframework.web.servlet.HandlerInterceptor; importorg.springframework.web.servlet.ModelAndView; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; /** *Createdbyloweiron2017/5/1417:14 **author:张瑀楠 *email:hbloweir@163.com */ publicclassLoginInterceptorimplementsHandlerInterceptor{ privatestaticLoglogger=LogFactory.getLog(LoginInterceptor.class); publicbooleanpreHandle(HttpServletRequesthttpServletRequest,HttpServletResponsehttpServletResponse,Objecthandler)throwsException{ if(logger.isDebugEnabled()){ logger.debug("拦截器启动"); } /* *判断是否为HandlerMethod.class *如果不是说明当前请求并不是SpringMVC管理, *如果不是再自行根据业务做响应操作,这里直接返回true */ if(HandlerMethod.class.isInstance(handler)){ HandlerMethodhandlerMethod=(HandlerMethod)handler; //判断该handler是否有WebLoginRequired注解 WebLoginRequiredwebLoginRequired=handlerMethod.getMethod().getDeclaredAnnotation(WebLoginRequired.class); //如果该handler没有WebLoginRequired注解,判断所属Controller是否包含注解 if(null==webLoginRequired){ webLoginRequired=handlerMethod.getBeanType().getAnnotation(WebLoginRequired.class); } //如果需要WebLoginRequired判断session if(null!=webLoginRequired){ if(httpServletRequest.getSession().getAttribute(WebLogin.CURRENTUSER)==null){ StringexecuteURL=webLoginRequired.value(); if(StringUtils.isBlank(executeURL)){ executeURL=WebLogin.LOGIN; } httpServletResponse.sendRedirect(httpServletRequest.getContextPath()+executeURL); returnfalse; } } } returntrue; } publicvoidpostHandle(javax.servlet.http.HttpServletRequesthttpServletRequest,javax.servlet.http.HttpServletResponsehttpServletResponse,Objecto,ModelAndViewmodelAndView)throwsException{ if(logger.isDebugEnabled()){ logger.debug("postHandler"); } } publicvoidafterCompletion(javax.servlet.http.HttpServletRequesthttpServletRequest,javax.servlet.http.HttpServletResponsehttpServletResponse,Objecto,Exceptione)throwsException{ if(logger.isDebugEnabled()){ logger.debug("afterCompletion"); } } }
最终controller写法
1.不需要登录权限的
类和方法都不需要注解
@Controller @RequestMapping("auth") publicclassAuthController{ @RequestMapping("login") publicStringlogin(){ return"login"; } }
2.整个controller内都需要登录权限
在类上添加注解即可
@Controller @WebLoginRequired @RequestMapping("order") publicclassOrderController{ @RequestMapping("index") publicStringindex(){ return"index"; } }
3.controller某个方法需要登录权限
只在需要登录权限的方法上添加注解
在注解上可以指定需要重定向的链接
如果不指定则默认到login
@Controller @RequestMapping("order") publicclassOrderController{ @RequestMapping("index") publicStringindex(){ return"index"; } //需要登录 @WebLoginRequired @RequestMapping("add") publicStringindex(){ return"index"; } //需要登录,如果未登录跳到error @WebLoginRequired("error") @RequestMapping("delete") publicStringindex(){ return"index"; } }
以上就是SpringMVC如何使用注解完成登录拦截的详细内容,更多关于SpringMVC使用注解完成登录拦截的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。