非法请求:m/index/jsbm
http://zy.52jingsai.com/index/jsbm
扫码后面的链接
原理:
概览:用两种不同的方式实现阻止非法访问网页:拦截器、过滤器的使用和Spring-Security的使用。
拦截器和过滤器的使用:
在项目中加入拦截器与过滤器
工作原理:
1>拦截器:拦截的是 action,说白了拦截的是访问路径,但是阻止的方式是拦截网址的映射,还是可以通过访问页面的直接网址的非法访问方式进入网页;
2>过滤器:可以几乎过滤掉所有的东西;无论是网址的映射还是直接网址都会被过滤掉,用户只能通过登录方式进入网页;
3>配置拦截器:interceptor
Spring-mvc.xml中的配置信息:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/user/doLogin.do"/>
<bean class="com.zhongruan.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
4>新建拦截器包和类,需要的.java文件内容:
//定义拦截器
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//在拦截点执行前拦截,如果返回true则不执行拦截点后的才做
//获取session
HttpSession session = request.getSession();
//获取访问路径
String uri = request.getRequestURI();
//indexOf求出字符串内路径出现的下标,||uri.indexOf("user/doLogin.do")!=-1
if(session.getAttribute("userInfo")!=null){
//登录成功,不拦截
return true;
}else{
//拦截成功,非法操作返回登陆页面
response.sendRedirect(request.getContextPath()+"/user/doLogin.do");
return false;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//在处理过程中执行拦截
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//执行完之后,返回前拦截
}
}
配置过滤器Filter
在web.xml中的配置:
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>com.zhongruan.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<url-pattern>/pages/*</url-pattern>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
新建过滤器包和类,需要的.java文件内容:
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 {
//区别:Interceptor进入了servlet,所以重写的参数是HttpServletRequesst/Response
//Filter没有进入Servlet,ServletRequset
//SerletRequest是接口,这里有些方法是HttpServletRequest中独有的
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse)servletResponse;
HttpSession session = request.getSession();
if(session.getAttribute("userInfo") == null&&request.getRequestURI().indexOf("/user/doLogin.do")==-1){
response.sendRedirect(request.getContextPath()+"/user/doLogin.do");
}else {
filterChain.doFilter(request,response);
}
}
@Override
public void destroy() {
//过滤器死亡
}
}
二、实现权限框架,Spring-Security的使用
1.完成spring-security的配置以及应用
Spring-security :
理解: 是spring 项目组中 提供 安全认证服务的框架
认证:验证用户密码是否正确的过程
授权:对用户所能访问的资源进行控制
应用步骤:
导架包 – Pom.xml,在相应位置需要加入的信息:
<!--spring.security版本号-->
<spring.security.version>5.0.1.RELEASE</spring.security.version>
Dependencies中内容:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${spring.security.version}</version>
</dependency>
配置web.xml
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
新建 Spring-Security.xml
其中定义了拦截规则和不拦截的资源;
Web.xml里,加载配置文件
5. UserService继承 UserDeatilsService,
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//查询当前登录的用户信息
UserInfo userInfo = userDao.doLogin(username);
System.out.println("获得的用户信息为:"+userInfo);
//查询当前用户有多少角色
List<Role> roleList = roleDao.findRoleByUserId(userInfo.getId());
//需要把角色放进用户中
System.out.println("获得的列表信息为:"+roleList);
userInfo.setRoleList(roleList);
//把查询的到的User和Role数据给到Spring-Security中的内置对象User来管理
User user = new User(userInfo.getUsername(),"{noop}"+userInfo.getPassword(),getAuthority(userInfo.getRoleList()));
return user;
}
private Collection<? extends GrantedAuthority> getAuthority(List<Role> roleList) {
List<SimpleGrantedAuthority> list = new ArrayList<>();
for(Role role:roleList){
list.add(new SimpleGrantedAuthority("ROLE_"+role.getRoleName()));
}
return list;
}
取当前的用户信息,需要加入aside.jsp中的内容:
<security:authentication property="principal.username"></security:authentication>
总结:
应该是这个链接设置了非法访问控制,因此才会有这样的结果。