前言:拦截器,过滤器以及Servlet的基本使用。
1.拦截器
1.1简介
1.拦截器是Spring MVC中的一种对象,能拦截Controller的请求。
2.常见的拦截器的类型:
- 系统拦截器
- 自定义拦截器
3.作用:实现对请求的预处理
1.2创建拦截器
1.简单的登录拦截器
preHandle的返回值是true,直接放行。
返回值是false需要被拦截器处理。
拦截器处理时addPathPatterns()处理要拦截的url。
拦截器处理时excludePathPatterns()直接放行的url。
第一步:创建一个拦截器对象
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("执行了拦截器");
return false;
}
}
第二步:编写拦截器的配置
- 先声明是一个配置类
- 注入拦截器对象
@Configuration
public class InterceptptorConfig implements WebMvcConfigurer {
// 注入拦截器对象
@Autowired
HandlerInterceptor handlerInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
/*
*addPathPatterns()要拦截谁
* excludePathPatterns()不拦截谁
*/
String path="/user/**";
String excludePath="/user/login";
registry.addInterceptor(handlerInterceptor).excludePathPatterns(excludePath).addPathPatterns(path);
}
}
运行截图:
被拦截的页面显示空白:
没有被拦截的页面:
2.Servlet
2.1创建
继承HttpServlet,实现doget等方法实现Servlet
1.使用步骤:
- 创建Servlet类
- 注册Servlet,让框架能够找到Servlet
第一步:创建一个类继承HttpServlet。
@Component
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;charset=utf-8");
PrintWriter out=resp.getWriter();
out.println("执行的Servlet");
out.close();
}
}
第二步:注册Servlet(创建配置文件)。
- 声明是一个配置文件
- 将bean对象注入到容器中
第一种:有参构造的方式
- ServletRegistrationBean有参构造
@Configuration
public class ServletConfig {
@Autowired
private MyServlet myServlet;
// 注册servlet对象
@Bean
public ServletRegistrationBean servletRegistrationBean(){
// 1.第一步:
ServletRegistrationBean bean=new ServletRegistrationBean(myServlet,"/myservlet");
return bean;
}
}
第二种方式:
- ServletRegistrationBean无参构造。
- 其余和第一种方式一样。
ServletRegistrationBean bean=new ServletRegistrationBean();
bean.setServlet(myServlet);
bean.addUrlMappings("/myservlet");
3.过滤器
3.1简介
1.过滤器:是Servlet中的,拦截器是SpringMVC的。过滤器,常常在过滤器中处理字符编码,对请求的参数和属性进行调整。
3.2创建过滤器
Filter接口的实现。
1.创建一个基本的过滤器。
第一步:创建一个过滤器
- 实现Filter接口。
//自定义过滤器
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("执行了过滤器!");
chain.doFilter(request,response);
}
}
第二步:注册Filter(编写配置文件)
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean registrationBean(){
FilterRegistrationBean filter=new FilterRegistrationBean();
// 设置自定义的过滤器对象
MyFilter myFilter=new MyFilter();
filter.setFilter(myFilter);
filter.addUrlPatterns("/user/*");
return filter;
}
}
第三步:编写测试的controller
@RestController
public class UserController {
@RequestMapping("/user/account")
public String UserAction(){
return "过滤器";
}
@RequestMapping("/account")
public String Action(){
return "无过滤器";
}
}
运行截图:
控制台出现:
而后者
控制台无反应
4.3字符集过滤器
自定义过滤器实现。
专有的字符集过滤器。
配置文件配置。
1.解决的是post请求中乱码的问题,SpringMVC中在xml中配置。
2.乱码问题
第一步:创建一个servlet
- 输出一段中文
- resp.setContentType("text/html");不指定编码的方式
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();
}
}
第二步:注册servlet
@Configuration
public class ServletConfig {
@Bean
public ServletRegistrationBean servletRegistrationBean(){
ServletRegistrationBean bean=new ServletRegistrationBean(new MyServlet(),"/myservlet");
return bean;
}
}
运行截图:
界面内容显示乱码。
查看响应头信息:编码方式ISO-8859-1
3.解决乱码问题方式1-自定义的Filter
只需要在创建的响应的类型加上一句:
resp.setContentType("text/html;charset=utf-8");
就可以了。
4.解决乱码问题方式2-CharacterEncodingFilter过滤器
第一步:在JavaConfig文件中直接配置
- 创建字符集的过滤器
- 指定编码方式
- 设置请求和响应都使用指定的编码
- 设置过滤的路径
- 配置文件中关闭默认的字符集过滤器
@Bean
public FilterRegistrationBean registrationBean(){
FilterRegistrationBean registrationBean=new FilterRegistrationBean();
// 使用框架中专有的过滤器类
CharacterEncodingFilter characterEncodingFilter=new CharacterEncodingFilter();
// 指定编码方式
characterEncodingFilter.setEncoding("utf-8");
// 指定req和reqs都使用指定的编码方式
characterEncodingFilter.setForceEncoding(true);
// 指定url的过滤地址
registrationBean.setFilter(characterEncodingFilter);
// 指定url的过滤地址
registrationBean.addUrlPatterns("/*");
return registrationBean;
}
第二步:关闭默认的字符集过滤器
#关闭系统配置好的过滤器
#server.servlet.encoding.enabled=false
5.解决乱码的方式3-配置文件设置编码方式
在配置文件中指定编码方式是最简洁的方式
#系统的字符集过滤器生效 server.servlet.encoding.enabled=true #指定使用的编码方式 server.servlet.encoding.charset=utf-8 #请求和响应都使用utf-8的响应方式 server.servlet.encoding.force=true
1.设置的方式
#系统的字符集过滤器生效
server.servlet.encoding.enabled=true
#指定使用的编码方式
server.servlet.encoding.charset=utf-8
#请求和响应都使用utf-8的响应方式
server.servlet.encoding.force=true