spring boot 与 filter
spring boot 里面用拦截器好像比用过滤器多一些. 在过滤器中, 并不能获取到action的相关信息, 会造成很多的麻烦和功能欠缺.
那, 这里就用过滤器做一个小栗子, 实际使用过程中, 不会这么做的.
用过滤器做一个不完善的登录权限判断.
一. 过滤器
package org.elvin.springboot.filter; import org.thymeleaf.util.StringUtils; import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException; public class LoginFilter implements Filter { private String passUrl; private String loginUrl; //region getter / setter
public String getPassUrl() {
return passUrl;
} public void setPassUrl(String passUrl) {
this.passUrl = passUrl;
} public String getLoginUrl() {
return loginUrl;
} public void setLoginUrl(String loginUrl) {
this.loginUrl = loginUrl;
}
//endregion @Override
public void init(FilterConfig filterConfig) throws ServletException { } @Override
public void destroy() { } @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response; if(isPassUrl(req)){
filterChain.doFilter(req, resp);
return;
} HttpSession session = req.getSession();
String token = (String)session.getAttribute("token");
if(StringUtils.isEmpty(token)){
resp.sendRedirect(req.getContextPath() + loginUrl);
return ;
} filterChain.doFilter(req, resp);
} /**
* 判断是否不需要权限
* @param req
* @return
*/
public boolean isPassUrl(HttpServletRequest req){
String requestURI = req.getRequestURI() + ";";
String contextPath = req.getContextPath();
if(!requestURI.startsWith(contextPath)){
return false;
}
requestURI = requestURI.substring(contextPath.length());
if(0 <= passUrl.indexOf(requestURI)){
return true;
}
return false;
}
}
在这里栗子里, 应该在过滤器里面加个文件请求过滤. 不过, 好像没有影响到结果, 所以, 懒得处理了, 后面拦截器的时候, 会再实现一遍这个功能.
二. 拦截器的java配置文件
package org.elvin.springboot.config; import org.elvin.springboot.filter.LoginFilter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import javax.servlet.Filter; @Configuration
public class LoginConfig { @Value("${passUrl}")
private String passUrl; @Value("${loginUrl}")
private String loginUrl; @Bean(name="loginFilter")
public Filter loginFilter(){
LoginFilter filter = new LoginFilter();
filter.setPassUrl(passUrl);
filter.setLoginUrl(loginUrl);
return filter;
} @Bean
public FilterRegistrationBean registrationBean(){
FilterRegistrationBean reg = new FilterRegistrationBean();
reg.setFilter(loginFilter());
reg.addUrlPatterns("/*");
reg.setName("loginFilter");
reg.setOrder(Integer.MAX_VALUE);
return reg;
} }
这里面没有写注释了, 看到方法名, 应该能看明白方法是干啥的.
三. yml配置文件
passUrl: /login/index;/login/checkOut;
loginUrl: /login/index
loginUrl 是登录页面地址, passUrl 是不需要登录的页面地址
到这里, 过滤器已经结束了. 接下来, 加入控制器和视图.
四. controller / view
package org.elvin.springboot.controller; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; @Controller
@RequestMapping("login")
public class LoginController { @Autowired
private HttpServletRequest request; @GetMapping("index")
public String index(){
HttpSession session = request.getSession();
session.setAttribute("token", "token"); return "login/index";
} @PostMapping("checkOut")
@ResponseBody
public String checkOut(){
HttpSession session = request.getSession();
session.setAttribute("token", null);
return "success";
}
}
html:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>index</title>
<link rel="stylesheet" th:href="@{/bootstrap/css/bootstrap.css}" />
</head>
<body>
<div class="container">
<input type="button" th:value="登出" id="checkout"/>
</div> <script th:src="@{/js/jquery-1.11.3.js}"></script>
<script th:src="@{/bootstrap/js/bootstrap.js}" ></script>
<script th:inline="javascript">
$(function(){
$(".container").delegate("#checkout", "click", function(){
$.ajax({
url: [[@{/login/checkOut}]],
type:'post',
data:'',
success: function(res){
if(res == "success"){
alert("登出成功!");
}
}
});
});
});
</script>
</body>
</html>
结果展示还真不好弄, 得弄成 动态图片, 额, 个人比较懒, 就算了.
spring boot 与 filter的更多相关文章
- Spring Boot实践——Filter实现
Filter介绍 Filter是Servlet规范规定的,不属于spring框架,也是用于请求的拦截.但是它适合更粗粒度的拦截,在请求前后做一些编解码处理.日志记录等. 一个Filter包括:1).在 ...
- spring boot: 通过filter过滤器实现中文的简体繁体字符集转换(spring boot 2.3.1)
一,为什么要使用filter来实现简繁体转换? 项目中有时会有同时支持简体和繁体两种字符集的要求, 或者搜索引擎有支持繁体输入字符的需求. 针对繁体字符的显示, 我们通常会在数据库和模板.文案配置中默 ...
- Spring Boot配置Filter
此博客是学习Spring Boot过程中记录的,一来为了加深自己的理解,二来也希望这篇博客能帮到有需要的朋友.同时如果有错误,希望各位不吝指教 一.通过注入Bean的方式配置Filter: 注意:此方 ...
- Spring Boot 使用 Filter
Filter 是 JavaEE 中 Servlet 规范的一个组件,位于包javax.servlet 中,它可以在 HTTP 请求到达 Servlet 之前,被一个或多个Filter处理. 1. 编写 ...
- Spring boot 注册Filter , Listener, Servlet
1: ServletRegistrationBean Servlet @Bean public ServletRegistrationBean myServlet(){ ServletRegist ...
- spring boot 捕获filter异常 统一返回处理结果
如前面的文章所述,controller中抛出的异常我们使用ControllerAdvice来处理: @RestControllerAdvice @Slf4j public class GlobalEx ...
- Spring Boot的filter简单使用
过滤器(Filter)的注册方法和 Servlet 一样,有两种方式:代码注册或者注解注册 1.代码注册方式 通过代码方式注入过滤器 @Bean public FilterRegistrati ...
- Spring Boot 整合Filter
两种方法 方法一: 正常创建好Filter类,配置完成 package clc.user.filter; import javax.servlet.Filter; import javax.servl ...
- Spring Boot 自定义Filter
一.Filter功能 它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servle ...
随机推荐
- C#-.Net Framework和.Net Compact Framework-摘
.Net Compact Framework 一种独立于硬件的环境,用于在资源受限制的计算设备上运行程序.它继承了公共语言运行时的完整 .NET Framework 结构,支持 .NET Framew ...
- 找不到UserDetails.java
真是一个奇葩的问题,dubbo接口 在controller中引用是可以正常的,但是放到service层中,就一直报找不到UserDetails.java,从路径看,看不出来是什么包里面的类 结果把路径 ...
- 20155326 《Java程序设计》实验五网络编程与安全实验报告
20155326 <Java程序设计>实验五网络编程与安全实验报告 实验内容 任务一 1.两人一组结对编程: 参考http://www.cnblogs.com/rocedu/p/67667 ...
- libgdx游戏中的中文字体工具类
// ---------全局Font------------ static FreeTypeFontGenerator Generator; static BitmapFont Font; stati ...
- iOS 使用代码创建约束,实现自动布局
///与下面约束对象属性截图相对应//使用Auto Layout约束,禁止将Autoresizing Mask转换为约束 [self.funcView setTranslatesAutoresizin ...
- MySql and Oracle Data Type Mappings
the default settings used by SQL Developer to convert data types from MySQL to Oracle. SQL Developer ...
- 关于能量场和力场弯曲空间的实验证明 EXPERIMENTAL PROOF ON THE BENDING SPACE OF ENERGY FIELD AND FORCE FIELD
前文提到,F = ma, E = mc^2,并且等效是传递的,等效概念具有同属性.所以不止能量,力场也可以弯曲空间. 实验:某人被头顶上方的电站10几万伏的设备吸收,烧毁双臂. (虽然这个实验不应具有 ...
- 基于Redis的CAS集群
单点登录(SSO)是复杂应用系统的基本需求,Yale CAS是目前常用的开源解决方案.CAS认证中心,基于其特殊作用,自然会成为整个应用系统的核心,所有应用系统的认证工作,都将请求到CAS来完成.因此 ...
- mongdb window 服务安装批处理
安装mongodb 3.x 安装完毕后 将以下代码保存为批处理 然后用管理员权限执行就可以成功安装服务了 cd C:\Program Files\MongoDB\Server\3.0\binmongo ...
- 一步一步学习Swift之(三):巧用AutoLayout布局
一些初学者经常在使用autoLayout时,做得效果不太理想,经常会出现界面错乱的情况. 本文章用一个小实例说明autoLayout的使用 非常的简单,只要记住 规则就可以使界面适屏布局,适配各种ip ...