Java SpringMVC中的拦截器如何使用
本文小编为大家详细介绍“Java SpringMVC中的拦截器如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java SpringMVC中的拦截器如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
简介SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。
过滤器
servlet规范中的一部分,任何java web工程都可以使用
在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截
拦截器
拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
拦截器只会拦截访问的控制器方法, 如果访问的是jsp/html/css/image/js是不会进行拦截的
过滤器与拦截器的区别:
拦截器是AOP思想的具体应用。
拦截器初体验1.新建一个项目,添加web支持,在IDEA导入该项目依赖的lib包。
2.配置web.xml
<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping><filter><filter-name>encoding</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>encoding</filter-name><url-pattern>/*</url-pattern></filter-mapping></web-app>
3.配置springmvc-servlet.xml
<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--扫描指定包,让指定包下的注解生效--><context:component-scanbase-package="controller"/><mvc:annotation-driven/><!--JSON解决乱码--><mvc:annotation-driven><mvc:message-convertersregister-defaults="true"><beanclass="org.springframework.http.converter.StringHttpMessageConverter"><constructor-argvalue="UTF-8"/></bean><beanclass="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><propertyname="objectMapper"><beanclass="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"><propertyname="failOnEmptyBeans"value="false"/></bean></property></bean></mvc:message-converters></mvc:annotation-driven><!--视图解析器--><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"id="internalResourceViewResolver"><propertyname="prefix"value="/WEB-INF/jsp/"/><propertyname="suffix"value=".jsp"/></bean></beans>
4.编写自定义的拦截器。(实现HandlerInterceptor接口)
packageinterceptor;importorg.springframework.web.servlet.HandlerInterceptor;importorg.springframework.web.servlet.ModelAndView;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;publicclassMyInterceptorimplementsHandlerInterceptor{//在请求处理的方法之前执行//如果返回true执行下一个拦截器//如果返回false就不执行下一个拦截器publicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{System.out.println("------------处理前------------");returntrue;}//在请求处理方法执行之后执行publicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{System.out.println("------------处理后------------");}//在dispatcherServlet处理后执行,做清理工作.publicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{System.out.println("------------清理------------");}}
事实上,只要重写preHandle方法就可以。
5.在springmvc-servlet.xml文件中配置拦截器
<!--关于拦截器的配置--><mvc:interceptors><mvc:interceptor><!--/**包括路径及其子路径--><!--/admin/*拦截的是/admin/add等等这种,/admin/add/user不会被拦截--><!--/admin/**拦截的是/admin/下的所有--><mvc:mappingpath="/**"/><!--bean配置的就是拦截器--><beanclass="interceptor.MyInterceptor"/></mvc:interceptor></mvc:interceptors>
6.编写controller
packagecontroller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;@RestControllerpublicclassInterceptorController{@RequestMapping("/interceptor")publicStringtest(){System.out.println("InterceptorController");return"ok";}}
7.配置Tomcat,进行测试
初体验:自定义拦截器实现了HandlerInterceptor接口,重写了preHandle方法。在preHandle方法中,返回值决定了是否拦截,当返回值为true时,不拦截;反之则拦截。
8.结果:
返回值为true,拦截器不拦截,跳转
返回值为false,拦截器拦截,不跳转
实现思路
有一个登陆页面,需要写一个controller访问页面。
登陆页面有一提交表单的动作。需要在controller中处理。判断用户名密码是否正确。如果正确,向session中写入用户信息。返回登陆成功。
拦截用户请求,判断用户是否登陆。如果用户已经登陆。放行, 如果用户未登陆,跳转到登陆页面
登录界面
<%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><title>Title</title></head><h2>登录页面</h2><hr><body><formaction="${pageContext.request.contextPath}/user/login">用户名:<inputtype="text"name="username"><br>密码:<inputtype="password"name="pwd"><br><inputtype="submit"value="提交"></form></body></html>
controller处理请求
packagecontroller;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importjavax.servlet.http.HttpSession;@Controller@RequestMapping("/user")publicclassUserController{//跳转到登陆页面@RequestMapping("/jumplogin")publicStringjumpLogin()throwsException{return"login";}//跳转到成功页面@RequestMapping("/jumpSuccess")publicStringjumpSuccess()throwsException{return"success";}//登陆提交@RequestMapping("/login")publicStringlogin(HttpSessionsession,Stringusername,Stringpwd)throwsException{//向session记录用户身份信息System.out.println("接收前端==="+username);session.setAttribute("user",username);return"success";}//退出登陆@RequestMapping("logout")publicStringlogout(HttpSessionsession)throwsException{//session过期session.invalidate();return"login";}}
登录成功页面
<%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><title>Title</title></head><body><h2>登录成功页面</h2><hr>${user}<ahref="${pageContext.request.contextPath}/user/logout">注销</a></body></html>
index页面
<%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><title>$Title$</title></head><body><h2>首页</h2><hr><%--登录--%><ahref="${pageContext.request.contextPath}/user/jumplogin">登录</a><ahref="${pageContext.request.contextPath}/user/jumpSuccess">成功页面</a></body></html>
index页面
<%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><title>$Title$</title></head><body><h2>首页</h2><hr><%--登录--%><ahref="${pageContext.request.contextPath}/user/jumplogin">登录</a><ahref="${pageContext.request.contextPath}/user/jumpSuccess">成功页面</a></body></html>
编写控制器
packageinterceptor;importorg.springframework.web.servlet.HandlerInterceptor;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;publicclassLoginInterceptorimplementsHandlerInterceptor{publicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{if(request.getRequestURI().contains("login")){returntrue;}HttpSessionsession=request.getSession();//如果用户已登陆,不拦截if(session.getAttribute("user")!=null){returntrue;}//用户没有登陆,拦截,并跳转到登陆页面request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);returnfalse;}}
在springmvc-servlet.xml配置拦截器
<mvc:interceptor><mvc:mappingpath="/**"/><beanid="loginInterceptor"class="interceptor.LoginInterceptor"/></mvc:interceptor>
配置Tomcat,测试。
结果:没有登录就无法直接访问登陆成功页面。
读到这里,这篇“Java SpringMVC中的拦截器如何使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。