拦截器 & 过滤器
【摘要】 拦截器 & 过滤器拦截器(Interceptor)Java Web 中,在执行 Controller 方法前后对 Controller 请求进行拦截和处理。依赖于 web 框架,在 Spring 配置。在实现上基于 Java 的反射机制。过滤器(Filter)Java Web 中,在 request/response 传入 Servlet 前,过滤信息或设置参数。依赖于 servlet 容器...
拦截器 & 过滤器
- 拦截器(Interceptor)
Java Web 中,在执行 Controller 方法前后对 Controller 请求进行拦截和处理。依赖于 web 框架,在 Spring 配置。在实现上基于 Java 的反射机制。
- 过滤器(Filter)
Java Web 中,在 request/response 传入 Servlet 前,过滤信息或设置参数。依赖于 servlet 容器,在 web.xml 配置。在实现上基于函数回调。
两者常用于修改字符编码、删除无用参数、登录校验等。Spring 框架中优先使用拦截器:功能接近、使用更加灵活。
拦截器配置
// 在配置中引入拦截器对象(单独编写拦截器类)
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 导入拦截器对象,默认拦截全部
InterceptorRegistration addInterceptor = registry.addInterceptor(new myInterceptor());
// 排除配置
addInterceptor.excludePathPatterns("/error","/login","/user/login");
addInterceptor.excludePathPatterns("/asserts/**");
addInterceptor.excludePathPatterns("/webjars/**");
addInterceptor.excludePathPatterns("/public/**");
// 拦截配置
addInterceptor.addPathPatterns("/**");
}Copy to clipboardErrorCopied
拦截器类通过实现 HandlerInterceptor 接口或者继承 HandlerInterceptorAdapter 类。
// 定义拦截器
public class myInterceptor extends HandlerInterceptorAdapter {
// Session key
public final static String SESSION_KEY = "user";
// preHandle 预处理
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 检查 session
HttpSession session = request.getSession();
if (session.getAttribute(SESSION_KEY) != null) return true;
// 重定向到登录页面
request.setAttribute("message","登录失败,请先输入用户名和密码。");
request.getRequestDispatcher("login").forward(request,response);
return false;
}
// postHandle 善后处理
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) {
System.out.println("INTERCEPTOR POSTHANDLE CALLED");
}
}Copy to clipboardErrorCopied
过滤器类通过继承 Filter 类实现,直接添加注解即可。
@Component // 作为组件,交给容器处理
@ServletComponentScan // 扫描组件
@WebFilter(urlPatterns = "/login/*",filterName = "loginFilter") // 设定过滤路径和名称
@Order(1) // 设定优先级(值小会优先执行)
public class LoginFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 过滤器前执行
System.out.println("before");
// 执行内部逻辑
filterChain.doFilter(servletRequest,servletResponse);
// 过滤器后执行
System.out.println("after");
}
@Override
public void destroy() {
}
}Copy to clipboardErrorCopied
调用顺序
Spring Boot配置HTTPS
####生成SSL证书
https://www.cnblogs.com/benwu/articles/4891758.html
JDK提供证书管理工具: JDK\bin\keytool.exe
Tomcat使用Java提供的密码库,通过Java的Keytool工具生成JKS等格式的证书文件。 Apache使用OpenSSL提供的密码库,生成PEM、KEY、CRT等格式的证书文件。
cmd命令(JDK\bin目录打开)
密钥库: 保存密钥和对应的证书。【证书只含有公钥】
genkeypair 生成密钥对(非对称加密算法) genseckey 生成密钥(对称加密算法) 创建名为tomcat的密钥对以及自签名的证书,放入mykeystore密钥库中(不存在则创建) keytool -genkeypair -alias "tomcat" -keyalg "RSA" -validity 180 -keypass "123456" -keystore "D:\mykeystore.keystore" -storetype PKCS12 -storepass
- alias 证书别名
- keyalg 加密算法,生成密钥对默认RSA
- keysize 密钥键长,RSA默认2048
- validity 证书有效期,默认90
- keypass 证书密码
- keystore 密钥库路径,默认创建在用户目录下
- storetype 密钥库类型,默认JKS
- storepass 密钥库密码
查看密钥库 keytool -list -v -alias tomcat -keystore "D:\mykeystore.keystore" -storepass 123456
将生成的证书文件拷贝到项目resources目录下
####修改全局配置文件
application.properties格式
server.port = 8443
server.ssl.key-store = classpath:mykeystore.keystore
server.ssl.key-store-password = 123456
server.ssl.keyStoreType = PKCS12
server.ssl.keyAlias = tomcatCopy to clipboardErrorCopied
设置SSL后,默认使用HTTPS协议。访问localhost:8443,会出现证书安全提示,强行进入即可。 【未付费注册,不被数字认证机构CA认可:会被浏览器标记为不安全】
如果将服务器端口号设置成443端口,即https的默认访问端口,那么在进行https访问的时候可以不带端口号直接访问。
修改入口文件
如果访问http://localhost:8443,则提示需要TLS。
》》将http连接自动转换为https连接
@Configuration
public class TestSslApplication {
//servlet容器,自己写的bean会覆盖自动配置的bean?
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
tomcat.addAdditionalTomcatConnectors(createStandardConnector());
return tomcat;
}
// 新建connecter监听80端口,并重定向至8443
private Connector createStandardConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(80);
connector.setSecure(false);
connector.setRedirectPort(8443);
return connector;
}
}
Copy to clipboardErrorCopied
重新配置Servlet容器(Tomcat)
自动配置类ServletWebServerFactoryAutoConfiguration会读取bean
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)