实现安全登录的两种方法

article/2025/9/18 12:04:30

登录安全——拦截器和过滤器或权限框架的使用

本次我们将采用两种方法实现登录的安全性,首先介绍拦截器和过滤器。
一、 过滤器和拦截器:
过滤器产生的时间/开始工作的时间: 进入Tomcat之后,但是在进servlet之前。Interceptor进入了servlet
所以拦截器拦截的是动作,而过滤器拦截的是不合理的跳转页面。

1、配置和使用拦截器。

<mvc:interceptors>
<mvc:interceptor><!--   1.拦截所有的请求      --><mvc:mapping path="/**"/><!--  2.  mvc:exclude-mapping : 是一种拦截,可以放行或者对某个请求不拦截,     --><mvc:exclude-mapping path="/user/doLogin.do"/><!--  3. 告诉我们要用哪个拦截器      --><bean class="com.zhongruan.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>

</mvc:interceptors>

解释:除了login之外的请求都不允许执行

public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//在拦截点执行前拦截,如果返回true,则不执行拦截点后的才做//获取sessionHttpSession session = request.getSession();//获取访问路径String uri = request.getRequestURI();//indexOf函数:求出字符串内路径出现的下标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 {//执行完毕之后,返回前拦截
}

}

重写拦截点前拦截动作的函数:
如果登录成功,则证明是真正的用户,所以放弃拦截(拦截器也因此失效);如果登录失败,则重新返回登录界面,且无法输入其他动作跳转到其他界面。

2、配置和使用过滤器:

<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>

上面是指请求所有界面都要通过过滤器,filter的实现如下:

   public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//区别:Interceptor进入了servlet,所以重写的参数时HttpServletRequest/Response//   Filter没有进入Servlet.ServletRequest//  ServletRequest是接口,HttpServletRequest是实现,这里有些方法是HttpServletRequest中独有的,例如getSession//所以要强制转换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);}
}

同样,过滤器使用过后就会失效,如果是真正的用户,可以访问其他界面,否则不能在登录界面访问其他界面。

结果展示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
二、 使用权限框架Spring-Security
1、首先在pom.xml文件中导入框架需要的jar包

<!--  spring.security架包      -->
<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>

2、配置web.xml文件
添加如下语句:

<!--   配置 Spring-security;添加过滤器拦截所有请求  --><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>

3、添加角色类:
由于验证机制是可以将用户类和管理员类区分开,登录后进入不同的界面,所以我们要增加一个角色类Role,它有三个属性:id,roleName和roleDesc,还有它们的get/set方法以及toString方法。
另外在UserInfo类中添加新的属性roleList(一个人可能对应多个角色)及其对应的方法。

4、添加Dao层:
新建一个名为“RoleDao”的接口类,并定义一个List findRoleByUserId(int userId);
方法。

 <select id="findRoleByUserId" parameterType="java.lang.Integer"        resultType="com.zhongruan.bean.Role">select * from tb_Role where id in(select roleId from tb_user_role    where userId=#{userId})</select>

可以看出,这个sql语句使用了多表查询。先在tb_user_role表中根据userid查询该用户的roleid,再在tb_Role表中查找该roleid对应的角色是什么。

5、service层:

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {// 1. 查询当前登录的用户信息UserInfo userInfo = userDao.doLogin(username);System.out.println("获得的用户线信息为:"+ userInfo);// 2. 查询当前的用户有多少角色List<Role> roleList = roleDao.findRoleByUserId(userInfo.getId());// 3. 需要把角色给放入用户中userInfo.setRoleList(roleList);// 4. 把查询到的User和Role数据  给到Spring-security中的内置对象User来管理User user = new User(userInfo.getUsername(), "{noop}" + userInfo.getPassword(), getAuthority(userInfo.getRoleList()));return user;

}
下面是getAuthority的代码:

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;

}
6、准备spring-security文件:

    <security:global-method-security pre-post-annotations="enabled" jsr250-annotations="enabled" secured-annotations="enabled"></security:global-method-security><!-- 配置不拦截的资源 -->
<security:http pattern="/login.jsp" security="none"/>
<security:http pattern="/failer.jsp" security="none"/>
<security:http pattern="/css/**" security="none"/>
<security:http pattern="/img/**" security="none"/>
<security:http pattern="/plugins/**" security="none"/>
<!--配置具体的规则auto-config="true" 不用自己编写登录的页面,框架提供默认登录页面use-expressions="false"    是否使用SPEL表达式(没学习过)
-->
<security:http auto-config="true" use-expressions="true"><!-- 配置具体的拦截的规则 pattern="请求路径的规则" access="访问系统的人,必须有ROLE_USER的角色" --><security:intercept-url pattern="/**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')"/><security:form-login login-page="/login.jsp"login-processing-url="/login.do"default-target-url="/index.jsp"authentication-failure-url="/failer.jsp"authentication-success-forward-url="/pages/main.jsp"/><!-- 关闭跨域请求 --><security:csrf disabled="true"/><!--退出并跳转到首页--><security:logout invalidate-session="true" logout-url="/logout.do" logout-success-url="/login.jsp"></security:logout>
</security:http><!-- 切换成数据库中的用户名和密码 -->
<security:authentication-manager><security:authentication-provider user-service-ref="userService"><!-- 配置加密的方式<security:password-encoder ref="passwordEncoder"/> --></security:authentication-provider>
</security:authentication-manager>
<!-- 配置加密类 -->
<bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>

7、login.jsp页面:

这里直接用login.do而不是doLogin.do(之前的函数已经被注释掉了)。这个login.do的实现是在框架里写所以我们不需要管。

Aside.jsp页面:
由于登录后会在左上角显示登录用户的头像和信息以及可以进行的操作,所以需要在下拉菜单的链接加上一句<security:authentication property=“principal.username”></security:authentication>
同时加上如下代码:

<security:authorize access="hasRole('ADMIN')"><ahref="${pageContext.request.contextPath}/user/findAll.do?page=1&size=5"> <iclass="fa fa-circle-o"></i> 用户管理
</a></security:authorize>

意思是只有管理员拥有“用户管理”这个选项,普通用户界面不显示。
下面是运行结果展示:

如果是输入了错误的用户名或密码:
在这里插入图片描述

如果是管理员身份成功登录:
在这里插入图片描述
如果是用户身份成功登录:
在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/OmKgC0Gn.shtml

相关文章

推荐几款优秀的搜素引擎

秘迹搜索 网址&#xff1a;https://mijisou.com/ 秘迹搜索是一款守护用户搜索信息的聚合搜索引擎&#xff0c;Ta不会根据搜索关键词追踪用户&#xff0c;也不会通过历史搜索内容做广告推荐。秘迹搜索通过聚合中文搜索服务比如Bing、百度、360、搜狗等搜索结果提供私密搜索服务…

12.推荐几款好用的搜索引擎

1.goobe https://goobe.io/ 专为程序员设计的搜索引擎&#xff08;搜索非技术相关的东西也很6&#xff09;&#xff0c;界面是这样事儿的 而且可以通过快照访问stackoverflow和github&#xff0c;非常好用 无广告&#xff0c;不跟踪 2.萌搜 https://mengso.com/ 号称小众的…

《搜索和推荐中的深度匹配》——1.1搜索和推荐

重磅推荐专栏&#xff1a; 《Transformers自然语言处理系列教程》 手把手带你深入实践Transformers&#xff0c;轻松构建属于自己的NLP智能应用&#xff01; 随着Internet的快速发展&#xff0c;当今信息科学的基本问题之一变得更加重要&#xff0c;即如何从通常庞大的信息库中…

基于Elasticsearch实现搜索推荐

在基于Elasticsearch实现搜索建议一文中我们曾经介绍过如何基于Elasticsearch来实现搜索建议&#xff0c;而本文是在此基于上进一步优化搜索体验&#xff0c;在当搜索无结果或结果过少时提供推荐搜索词给用户。 背景介绍 在根据用户输入和筛选条件进行搜索后&#xff0c;有时…

五个小众好用的搜索引擎

一、wikiHow https://zh.wikihow.com/ 我把wikiHow当做一个帮我做任何事的搜索引擎 wikiHow上每一篇详尽明了的指南文章 都能改善成百上千人的生活 与维基百科类似&#xff0c;wikiHow 也采用了维基技术 所有人都可以创建或编辑文章中的内容 来自全球的协作者们已编写了…

阿里搜索推荐系统

一、系统框架 导购升级的优化思路从三个方向着手&#xff1a;1.策略升级。利用深度学习及异构网络的思想&#xff0c;对用户个性化进行更深的理解和建模&#xff1b;同时对因马太效应引起的独立query数下降等问题进行优化。 2.导购外投。在包括会场激活页、猜你喜欢等渠道进行搜…

推荐和搜索系统的多样性研究综述

前言 检索结果的多样化是检索系统的一个重要研究课题&#xff0c;其可以满足用户的各种兴趣和供应商的平等公平曝光。 然而&#xff0c;检索系统中&#xff08;搜索与推荐领域&#xff09;的多样性研究缺乏一个系统的汇总&#xff0c;并且研究点相对零散。本次介绍的paper中&am…

从零开始搭建搜索推荐系统(五十二)ElasticSearch搜索利器

聊的不止技术。跟着小帅写代码&#xff0c;还原和技术大牛一对一真实对话&#xff0c;剖析真实项目筑成的一砖一瓦&#xff0c;了解最新最及时的资讯信息&#xff0c;还可以学到日常撩妹小技巧哦&#xff0c;让我们开始探索主人公小帅的职场生涯吧&#xff01; &#xff08;PS…

《智能搜索和推荐系统》总结

这本书主要分为4部分介绍&#xff0c;分别是搜索和推荐的基础&#xff0c;搜索系统基本原理&#xff0c;推荐系统的基本原理&#xff0c;工程应用。 第一部分&#xff1a;搜索和推荐的基础 主要讲了一下概率统计与应用数学的基础知识&#xff0c;比如概率论基础&#xff08;概率…

推荐系统与搜索引擎的差异

转自&#xff1a;https://blog.csdn.net/cserchen/article/details/50422553 详细分析推荐系统和搜索引擎的差异陈运文 从信息获取的角度来看&#xff0c;搜索和推荐是用户获取信息的两种主要手段。无论在互联网上&#xff0c;还是在线下的场景里&#xff0c;搜索和推荐这两种方…

商品搜索引擎---推荐系统设计

一、前言 结合目前已存在的商品推荐设计&#xff08;如淘宝、京东等&#xff09;&#xff0c;推荐系统主要包含系统推荐和个性化推荐两个模块。 系统推荐&#xff1a; 根据大众行为的推荐引擎&#xff0c;对每个用户都给出同样的推荐&#xff0c;这些推荐可以是静态的由系统管…

推荐一些不常见的搜索引擎

5.雅虎网 来自 Yahoo.com 的屏幕截图&#xff0c;2023 年 2 月 截至 2022 年 1 月&#xff0c;Yahoo.com&#xff08;Verizon Media&#xff09;的搜索市场份额为 11.2%。 雅虎的优势在于多元化&#xff0c;除搜索外还提供电子邮件、新闻、金融等服务。 二十多年来&#xff0c;…

相关搜索 --- 搜索中的推荐

0. 前面的瞎扯淡 互联网从开始出现&#xff0c;如果就信息获取方面的话&#xff0c;到现在经历了三个大的时期&#xff0c;最开始是人工信息的分类时期&#xff0c;作为一个上了岁数的人&#xff0c;是经历过那个时期的&#xff0c;那个时期如何来找信息呢&#xff1f;我们来看…

基于机器学习的搜索推荐系统

目录 一&#xff0e; 引言 1 二&#xff0e; 准备 2 一&#xff0e; 软件工程语言选择 2 二&#xff0e; 服务器的选取 2 三&#xff0e; 搜索服务 5 一&#xff0e; 搜索服务软件目录结构 5 二&#xff0e; 搜索服务功能 6 三&#xff0e; SPARQL语句分析 7 四&#xff0e; 经…

超好用的搜索引擎推荐

搜索引擎是我们信息资料搜集的最重要的渠道之一,用搜索引擎查找信息资料需要使用恰当的关键词和一些搜索技巧。目前国内主要的搜集引擎有如下10个,近期还有较多行业 型搜索冒出来,需找专业型行业资料可以使用行业型搜索引擎。 由于每个搜索引擎都有一定的局限性,可以把要…

搜索推荐相关

搜索算法 Learning to Rank方法&#xff1a; 1、单文档方法&#xff1a;根据query判断每个item的相似度 2、文档对方法&#xff1a;确定文档对的前后顺序 3、文档列表法&#xff1a;确定所有文档的先后顺序 Item&#xff1a;垂域、意图、语义相似性、item的热度、用户的搜索日…

推荐一个搜索引擎

yandex是一个俄罗斯搜索引擎。 https://yandex.com/ 最近很忙&#xff0c;月更。 水下文章。

ES-搜索推荐

1. 概述 搜索一般都会要求具有“搜索推荐”或者叫“搜索补全”的功能&#xff0c;即在用户输入搜索的过程中&#xff0c;进行自动补全或者纠错。以此来提高搜索文档的匹配精准度&#xff0c;进而提升用户的搜索体验&#xff0c;这就是Suggest。 ##四种Suggester 2. term sugge…

ul, li, a怎么用

<style type"text/css"> *{margin:0; padding:0;font-size:14px} body{padding-top:20px} ul,li{list-style: none} ul{background: yellow;} li{float:left; width:60px; height:50px;}//width:60px后加,不然ie li会比a宽 a{display:inline-block;padding:0 3…

html用ul li制作导航条

制作的导航条如图所示&#xff1a; 当鼠标滑过每个导航的时候&#xff0c;背景会变换颜色。技术点&#xff1a;将超链接a标签&#xff0c;转换成block标签&#xff0c;从而设置鼠标滑过时的背景色。代码如下所示&#xff1a; <html ><head><meta charset"…