目录:
(1)拦截器的使用
(2)使用Servlet
(3)过滤器的使用
字符集过滤的两种方式:
(4)字符集过滤器的应用:使用自定义过滤器
(5)在配置文件中设置编码方式
(1)拦截器的使用
创建拦截器的实现类:LoginInterceptor Ctrl+i 只实现preHandle()方法即可:
- package com.bjpowernode.web;
-
- import org.springframework.web.servlet.HandlerInterceptor;
-
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- //自定义拦截器
-
- public class LoginInterceptor implements HandlerInterceptor {
- /*
- * 参数:
- * handler:被拦截的控制器对象
- * 返回值:boolean:
- * true:请求能被Controller处理
- * false:请求不能被处理器处理,请求被截断
- * */
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
- System.out.println("执行了LoginInterceptor的preHandle方法");
- return true;
- }
- }
用这个拦截器,需要把这个拦截器加入到容器中才能起作用,创建好了拦截器怎么把它加入到容器中呢?
需要创建一个实现类,实现WebMvcConfigurer接口,这个接口有很多跟springmvc相关的功能,都在这个接口中实现了
原来我们要注册拦截器,需要写springmvc.xml的配文件,现在把文件中的配置移到了这个接口的方法中:
MyAppConfig:
- package com.bjpowernode.config;
-
- import com.bjpowernode.web.LoginInterceptor;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.web.servlet.HandlerInterceptor;
- import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
- import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
- @Configuration
- public class MyAppConfig implements WebMvcConfigurer {
- //用到拦截器需要实现这个方法,添加拦截器对象,注入到容器中
- @Override
- public void addInterceptors(InterceptorRegistry registry) {
- //创建拦截器对象
- HandlerInterceptor interceptor=new LoginInterceptor();
-
- //指定拦截的请求url地址
- String path []={"/user/**"};
- //指定不拦截的地址
- String excludePath []={"/user/login"};
-
- /*
- * addInterceptor()添加拦截器
- * addPathPatterns()添加拦截的地址
- * excludePathPatterns() 排除不拦截的地址
- * */
- registry.addInterceptor(interceptor).addPathPatterns(path).excludePathPatterns(excludePath);
- }
- }
创建控制器:BootController:
- package com.bjpowernode.controller;
-
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.ResponseBody;
-
- @Controller
- public class BootController {
-
- @RequestMapping("/user/account")
- @ResponseBody
- public String userAccount(){
- return "访问user/accout地址";
- }
-
- //拦截器之歌方法请求不拦截
- @RequestMapping("/user/login")
- @ResponseBody
- public String userLogin(){
- return "访问user/login地址";
- }
- }
主启动类Application:进行启动项目:
- package com.bjpowernode;
-
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
-
- @SpringBootApplication
- public class Application {
-
- public static void main(String[] args) {
- SpringApplication.run(Application.class, args);
- }
-
- }
在地址栏输入: 访问user/account
控制台会有输出:
在地址栏访问:user/login
但是控制台 没有输出:由于此请求没有被拦截,控制台没有输出
注意这里的user/account请求拦截了,但是preHand方法中返回true所以会正常执行,
排除:是指不经过拦截器,也就不会有输出,user/login的请求是不被拦截的
(2)使用Servlet
创建Servlet:MyServlet:
- package com.bjpowernode.web;
-
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
- import java.io.PrintWriter;
- //创建Servler类
- public class MyServlet extends HttpServlet {
-
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- doPost(req,resp);//Get方法中调用doPost这样无论是get请求,还是Post请求都能处理
- }
-
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //使用HttpServletResponse输出数据,应答结果
- resp.setContentType("text/html;charset=utf-8");//设置内容引擎,指定数据格式,编码
- PrintWriter out=resp.getWriter();
- out.println("执行的是Servlet");
- out.flush();
- out.close();
- }
- }
注册Servlet:
创建的Servlet要想能够被访问就得有对象,这个对象Servlet通过框架才能找到Servlet,所以进行Servlet进行注册,注册用到的类是ServletRegistrationBean,通过写一个配置类,定义一个方法返回值ServletRegistrationBean
创建配置类WebApplicationConfig:先使用ServletRegistrationBean有参构造两个参数的
- package com.bjpowernode.config;
-
- import com.bjpowernode.web.MyServlet;
- import org.springframework.boot.web.servlet.ServletRegistrationBean;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
-
- @Configuration
- public class WebApplicationConfig {
-
- //通过这个方法就可以得到Servlet对象和访问地址的信息
- //定义方法,注册Servle对象
- @Bean //注解将这个对象放到容器中,通过这个对象可以找到里面存放的Servlet
- public ServletRegistrationBean servletRegistrationBean(){
-
- //public ServletRegistrationBean(T servlet, String... urlMappings)
- //第一个参数是:Servlet对象 第二个参数是:url地址
- ServletRegistrationBean bean=new ServletRegistrationBean(new MyServlet(),"/myservlet");
- return bean;
- }
- }
主启动类:Application,进行启动项目:
- package com.bjpowernode;
-
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
-
- @SpringBootApplication
- public class Application {
-
- public static void main(String[] args) {
- SpringApplication.run(Application.class, args);
- }
-
- }
在浏览器地址栏输入:
使用ServletRegistrationBean没有参构造参数的
WebApplicationConfig:注释掉有参数的
- package com.bjpowernode.config;
-
- import com.bjpowernode.web.MyServlet;
- import org.springframework.boot.web.servlet.ServletRegistrationBean;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
-
- @Configuration
- public class WebApplicationConfig {
-
- //通过这个方法就可以得到Servlet对象和访问地址的信息
- //定义方法,注册Servle对象
- @Bean //注解将这个对象放到容器中,通过这个对象可以找到里面存放的Servlet
- public ServletRegistrationBean servletRegistrationBean(){
-
- //public ServletRegistrationBean(T servlet, String... urlMappings)
- //第一个参数是:Servlet对象 第二个参数是:url地址
- //ServletRegistrationBean bean=new ServletRegistrationBean(new MyServlet(),"/myservlet");
-
- ServletRegistrationBean bean=new ServletRegistrationBean();
- bean.setServlet(new MyServlet());
- bean.addUrlMappings("/login","/test"); //相当于<url-pattern>
-
- return bean;
- }
- }
Servlet:
在浏览器输入:http:localhost:8080/login
输入另外另一个访问地址:http:localhost:8080/test
(3)过滤器的使用
创建过滤器:MyFilter:
- package com.bjlpokwernode.web;
-
- import javax.servlet.*;
- import java.io.IOException;
- //自定义过滤器
- public class MyFilter implements Filter {
- @Override
- public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
- System.out.println("执行了MyFilter,doFilter");
- //要想请求能够执行下去,需要来执行,过滤器那个链filterChain,这样请求就能够往后传递,能够处理请求了
- filterChain.doFilter(servletRequest,servletResponse);
- }
- }
注册过滤器:
创建配置类:WebApplicationConfig:
- package com.bjlpokwernode.config;
-
- import com.bjlpokwernode.web.MyFilter;
- import org.springframework.boot.web.servlet.FilterRegistrationBean;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
-
- @Configuration
- public class WebApplicationConfig {
- //返回值,过滤器注册的对象
- @Bean
- public FilterRegistrationBean filterRegistrationBean(){
- FilterRegistrationBean bean=new FilterRegistrationBean();
- //指定过滤器
- bean.setFilter(new MyFilter());
- //过滤器地址
- bean.addUrlPatterns("/user/*");
- return bean;
- }
- }
创建控制器:
CustomFilterController:
- package com.bjlpokwernode.controller;
-
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.ResponseBody;
-
- @Controller
- public class CustomFilterController {
- @RequestMapping("/user/account")
- @ResponseBody
- public String userAccount(){
- return "user/account";
- }
-
- //不会进行过滤
- @RequestMapping("/querty")
- @ResponseBody
- public String queryAccount(){
- return "query";
- }
- }
主启动类Application:启动项目:
- package com.bjlpokwernode;
-
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
-
- @SpringBootApplication
- public class Application {
-
- public static void main(String[] args) {
- SpringApplication.run(Application.class, args);
- }
-
- }
在浏览器进行访问
控制台输出了:过滤器中的内容
输入:
控制台没有输出:
(4)字符集过滤器的应用:使用自定义过滤器
CharacterEncodingFilter过滤器:不是自己写的,在springmvc框架中有这个过滤器类的
创建Servlet:MyServlet:
- package com.bjpowernode.web;
-
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
- import java.io.PrintWriter;
-
- public class MyServlet extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- doPost(req,resp);
- }
-
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- resp.setContentType("text/html");
- PrintWriter out=resp.getWriter();
- out.println("在Servlet输出中文");
- out.flush();
- out.close();
- }
- }
配置类:WebSystenConfig:
- package com.bjpowernode.config;
-
- import com.bjpowernode.web.MyServlet;
- import org.springframework.boot.web.servlet.ServletRegistrationBean;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
-
- @Configuration
- public class WebSystemConfig {
- //注册Servlet
- @Bean
- public ServletRegistrationBean servletRegistrationBean(){
- MyServlet myServlet=new MyServlet();
-
- ServletRegistrationBean reg=new ServletRegistrationBean(myServlet,"/myservlet");
- return reg;
- }
- }
主启动类Application:启动项目:
- package com.bjpowernode;
-
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
-
- @SpringBootApplication
- public class Application {
-
- public static void main(String[] args) {
- SpringApplication.run(Application.class, args);
- }
-
- }
在浏览器访问:发现输出的中文乱码
默认编码方式IOS-8859-1
设置字符集过滤器
使用字符集过滤器:
WebSystenConfig:注册过滤器
- package com.bjpowernode.config;
-
- import com.bjpowernode.web.MyServlet;
- import org.springframework.boot.web.servlet.FilterRegistrationBean;
- import org.springframework.boot.web.servlet.ServletRegistrationBean;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.web.filter.CharacterEncodingFilter;
-
- @Configuration
- public class WebSystemConfig {
- //注册Servlet
- @Bean
- public ServletRegistrationBean servletRegistrationBean(){
- MyServlet myServlet=new MyServlet();
-
- ServletRegistrationBean reg=new ServletRegistrationBean(myServlet,"/myservlet");
- return reg;
- }
-
- //注册过滤器:
- @Bean
- public FilterRegistrationBean filterRegistrationBean(){
- FilterRegistrationBean reg=new FilterRegistrationBean();
-
- //使用框架中的过滤器
- CharacterEncodingFilter filter=new CharacterEncodingFilter();
- //设置过滤器参数
- filter.setEncoding("utf-8");//指定编码方式
- filter.setForceEncoding(true);//指定request,response都是用encoding的值
-
- //添加过滤器
- reg.setFilter(filter);
- //指定过滤器过滤的url地址 /*代表所有地址
- reg.addUrlPatterns("/*");
-
- return reg;
- }
- }
在配置文件application.properties中:
- #SpringBoot中默认已经配置了CharacterEncodingFilter,true,默认编码IOS-8859-1
- #需要设置enabled=false,作用是关闭系统中配置好的过滤器,使用自定义的CharacterEncodingFliter
- server.servlet.encoding.enabled=false
使用过滤器之后:
(5)在配置文件中设置编码方式
MyServlet:
- package com.bjpowernode.web;
-
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
- import java.io.PrintWriter;
-
- public class MyServlet extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- doPost(req,resp);
- }
-
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- resp.setContentType("text/html");
- PrintWriter out=resp.getWriter();
- out.println("******在Servlet输出中文,默认编码IOS-8859-1*********");
- out.flush();
- out.close();
- }
- }
配置类:WebSystenConfig:
- package com.bjpowernode.config;
-
- import com.bjpowernode.web.MyServlet;
- import org.springframework.boot.web.servlet.FilterRegistrationBean;
- import org.springframework.boot.web.servlet.ServletRegistrationBean;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.web.filter.CharacterEncodingFilter;
-
- @Configuration
- public class WebSystemConfig {
- //注册Servlet
- @Bean
- public ServletRegistrationBean servletRegistrationBean(){
- MyServlet myServlet=new MyServlet();
-
- //第一个参数的过滤器对象,第二个是请求方式请求地址
- ServletRegistrationBean reg=new ServletRegistrationBean(myServlet,"/myservlet");
- return reg;
- }
-
- }
配置文件application.properties:
- #端口号
- server.port=9001
- #访问路径
- server.servlet.context-path=/myboot
-
- #让系统的CharacterEncodingFilter生效
- server.servlet.encoding.enabled=true
- #指定编码方式
- server.servlet.encoding.charset=utf-8
-
- #设置请求和应答对象都是用charset的值
- server.servlet.encoding.force=true
主启动类:启动项目
- package com.bjpowernode;
-
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
-
- @SpringBootApplication
- public class Application {
-
- public static void main(String[] args) {
- SpringApplication.run(Application.class, args);
- }
-
- }
在浏览器输入地址: