【Shiro】第四章 Web项目集成Shiro(二)

简介: 【Shiro】第四章 Web项目集成Shiro(二)

【3】编写LoginService

1. package com.itheima.shiro.service;
2. 
3. import org.apache.shiro.authc.UsernamePasswordToken;
4. 
5. import java.lang.management.LockInfo;
6. 
7. /**
8.  * @Description:登录服务
9.  */
10. public interface LoginService {
11. 
12. /**
13.      * @Description 登录方法
14.      * @param token 登录对象
15.      * @return
16.      */
17. boolean login(UsernamePasswordToken token);
18. 
19. /**
20.      * @Description 登出方法
21.      */
22. void logout();
23. }
1. package com.itheima.shiro.service.impl;
2. 
3. import com.itheima.shiro.service.LoginService;
4. import org.apache.shiro.SecurityUtils;
5. import org.apache.shiro.authc.UsernamePasswordToken;
6. import org.apache.shiro.subject.Subject;
7. 
8. 
9. /**
10.  * @Description:登录服务
11.  */
12. public class LoginServiceImpl implements LoginService {
13. 
14. @Override
15. public boolean login(UsernamePasswordToken token) {
16. Subject subject = SecurityUtils.getSubject();
17. try {
18.             subject.login(token);
19.         }catch (Exception e){
20. return false;
21.         }
22. return subject.isAuthenticated();
23.     }
24. 
25. @Override
26. public void logout() {
27. Subject subject = SecurityUtils.getSubject();
28.         subject.logout();
29.     }
30. }

【4】编写SecurityServiceImpl

1. package com.itheima.shiro.service.impl;
2. 
3. import com.itheima.shiro.service.SecurityService;
4. 
5. import java.util.ArrayList;
6. import java.util.HashMap;
7. import java.util.List;
8. import java.util.Map;
9. 
10. /**
11.  * @Description:权限服务层
12.  */
13. public class SecurityServiceImpl implements SecurityService {
14. 
15. @Override
16. public Map<String,String> findPasswordByLoginName(String loginName) {
17. return DigestsUtil.entryptPassword("123");
18. return map;
19.     }
20. 
21. @Override
22. public List<String> findRoleByloginName(String loginName) {
23.         List<String> list = new ArrayList<>();
24. if ("admin".equals(loginName)){
25.             list.add("admin");
26.         }
27.         list.add("dev");
28. return list;
29.     }
30. 
31. @Override
32. public List<String>  findPermissionByloginName(String loginName) {
33.         List<String> list = new ArrayList<>();
34. if ("jay".equals(loginName)){
35.             list.add("order:list");
36.             list.add("order:add");
37.             list.add("order:del");
38.         }
39. return list;
40.     }
41. }

【5】添加web层内容

【5.1】LoginServlet
1. package com.itheima.shiro.web;
2. 
3. import com.itheima.shiro.service.LoginService;
4. import com.itheima.shiro.service.impl.LoginServiceImpl;
5. import org.apache.shiro.authc.UsernamePasswordToken;
6. 
7. import javax.servlet.ServletException;
8. import javax.servlet.annotation.WebServlet;
9. import javax.servlet.http.HttpServlet;
10. import javax.servlet.http.HttpServletRequest;
11. import javax.servlet.http.HttpServletResponse;
12. import java.io.IOException;
13. 
14. /**
15.  * @Description:登录方法
16.  */
17. @WebServlet(urlPatterns = "/login")
18. public class LoginServlet extends HttpServlet {
19. 
20. @Override
21. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
22. throws ServletException, IOException {
23.         doPost(req, resp);
24.     }
25. 
26. @Override
27. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
28. throws ServletException, IOException {
29. //获取输入的帐号密码
30. String username = req.getParameter("loginName");
31. String password = req.getParameter("password");
32. //封装用户数据,成为Shiro能认识的token标识
33. UsernamePasswordToken token = new UsernamePasswordToken(username, password);
34. LoginService loginService = new LoginServiceImpl();
35. //将封装用户信息的token进行验证
36. boolean isLoginSuccess = loginService.login(token);
37. if (!isLoginSuccess) {
38. //重定向到未登录成功页面
39.             resp.sendRedirect("login.jsp");
40. return;
41.         }
42.         req.getRequestDispatcher("/home").forward(req, resp);
43.     }
44. 
45. }
【5.2】HomeServlet
1. package com.itheima.shiro.web;
2. 
3. import javax.servlet.ServletException;
4. import javax.servlet.annotation.WebServlet;
5. import javax.servlet.http.HttpServlet;
6. import javax.servlet.http.HttpServletRequest;
7. import javax.servlet.http.HttpServletResponse;
8. import java.io.IOException;
9. 
10. /**
11.  * @Description:系统home页面
12.  */
13. @WebServlet(urlPatterns = "/home")
14. public class HomeServlet extends HttpServlet {
15. 
16. @Override
17. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
18. throws ServletException, IOException {
19.         doPost(req, resp);
20.     }
21. 
22. @Override
23. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
24. throws ServletException, IOException {
25.         req.getRequestDispatcher("home.jsp").forward(req, resp);
26.     }
27. }
【5.3】OrderAddServlet
1. package com.itheima.shiro.web;
2. 
3. import com.itheima.shiro.service.LoginService;
4. import com.itheima.shiro.service.impl.LoginServiceImpl;
5. import org.apache.shiro.authc.UsernamePasswordToken;
6. 
7. import javax.servlet.ServletException;
8. import javax.servlet.annotation.WebServlet;
9. import javax.servlet.http.HttpServlet;
10. import javax.servlet.http.HttpServletRequest;
11. import javax.servlet.http.HttpServletResponse;
12. import java.io.IOException;
13. 
14. /**
15.  * @Description:添加页码
16.  */
17. @WebServlet(urlPatterns = "/order-add")
18. public class OrderAddServlet extends HttpServlet {
19. 
20. @Override
21. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
22. throws ServletException, IOException {
23.         doPost(req, resp);
24.     }
25. 
26. @Override
27. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
28. throws ServletException, IOException {
29.         req.getRequestDispatcher("order-add.jsp").forward(req, resp);
30.     }
31. 
32. }
【5.4】OrderListServlet
1. package com.itheima.shiro.web;
2. 
3. import com.itheima.shiro.service.LoginService;
4. import com.itheima.shiro.service.impl.LoginServiceImpl;
5. import org.apache.shiro.authc.UsernamePasswordToken;
6. 
7. import javax.servlet.ServletException;
8. import javax.servlet.annotation.WebServlet;
9. import javax.servlet.http.HttpServlet;
10. import javax.servlet.http.HttpServletRequest;
11. import javax.servlet.http.HttpServletResponse;
12. import java.io.IOException;
13. 
14. /**
15.  * @Description:订单列表
16.  */
17. @WebServlet(urlPatterns = "/order-list")
18. public class OrderListServlet extends HttpServlet {
19. 
20. @Override
21. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
22. throws ServletException, IOException {
23.         doPost(req, resp);
24.     }
25. 
26. @Override
27. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
28. throws ServletException, IOException {
29.         req.getRequestDispatcher("order-list.jsp").forward(req, resp);
30.     }
31. }
【5.5】LogoutServlet
1. package com.itheima.shiro.web;
2. 
3. import com.itheima.shiro.service.LoginService;
4. import com.itheima.shiro.service.impl.LoginServiceImpl;
5. import org.apache.shiro.authc.UsernamePasswordToken;
6. 
7. import javax.servlet.ServletException;
8. import javax.servlet.annotation.WebServlet;
9. import javax.servlet.http.HttpServlet;
10. import javax.servlet.http.HttpServletRequest;
11. import javax.servlet.http.HttpServletResponse;
12. import java.io.IOException;
13. 
14. /**
15.  * @Description:登出
16.  */
17. @WebServlet(urlPatterns = "/logout")
18. public class LogoutServlet extends HttpServlet {
19. 
20. @Override
21. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
22. throws ServletException, IOException {
23.         doPost(req, resp);
24.     }
25. 
26. @Override
27. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
28. throws ServletException, IOException {
29. LoginService loginService = new LoginServiceImpl();
30.         loginService.logout();
31.     }
32. 
33. }

【6】添加JSP

login.jsp登录页面

1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
2. <html>
3. <head>
4.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5.     <title>Title</title>
6. </head>
7. <body>
8. <form method="post" action="${pageContext.request.contextPath}/login">
9.     <table>
10.         <tr>
11.             <th>登陆名称</th>
12.             <td><input type="text"  name="loginName"></td>
13.         </tr>
14.         <tr>
15.             <th>密码</th>
16.             <td><input type="password" name="password"></td>
17.         </tr>
18.         <tr>
19.             <td colspan="2">
20.                 <input type="submit" value="提交"/>
21.             </td>
22.         </tr>
23.     </table>
24. 
25. </form>
26. </body>
27. </html>

home.jsp系统页

1. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
2. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
3. <html>
4. <head>
5.     <title></title>
6. </head>
7. <body>
8. <h6>
9.     <a href="${pageContext.request.contextPath}/logout">退出</a>
10.     <a href="${pageContext.request.contextPath}/order-list">列表</a>
11.     <a href="${pageContext.request.contextPath}/order-add">添加</a>
12. </h6>
13. </body>
14. </html>

order-add.jsp订单添加(伪代码)

1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
2. <html>
3. <head>
4.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5.     <title>Title</title>
6. </head>
7. <body>
8. 添加页面
9. </body>
10. </html>

order-list.jsp订单列表

1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
2. <%--导入jstl标签库--%>
3. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
4. <html>
5. <head>
6.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
7.     <title>用户列表jsp页面</title>
8.     <style>
9.         table {border:1px solid #000000}
10.         table th{border:1px solid #000000}
11.         table td{border:1px solid #000000}
12.     </style>
13. 
14. </head>
15. <body>
16. <table cellpadding="0" cellspacing="0" width="80%">
17.     <tr>
18.         <th>编号</th>
19.         <th>公司名称</th>
20.         <th>信息来源</th>
21.         <th>所属行业</th>
22.         <th>级别</th>
23.         <th>联系地址</th>
24.         <th>联系电话</th>
25.     </tr>
26.     <tr>
27.         <td>1</td>
28.         <td>传智播客</td>
29.         <td>网络营销</td>
30.         <td>互联网</td>
31.         <td>普通客户</td>
32.         <td>津安创意园</td>
33.         <td>0208888887</td>
34.     </tr>
35.     <tr>
36.         <td>2</td>
37.         <td>黑马程序员</td>
38.         <td>j2ee</td>
39.         <td>互联网</td>
40.         <td>VIP客户</td>
41.         <td>津安创意园</td>
42.         <td>0208888887</td>
43.     </tr>
44.     <tr>
45.         <td>3</td>
46.         <td>黑马程序员</td>
47.         <td>大数据</td>
48.         <td>互联网</td>
49.         <td>VIP客户</td>
50.         <td>津安创意园</td>
51.         <td>0208888887</td>
52.     </tr>
53. </table>
54. </body>
55. 
56. </html>
相关文章
|
2月前
|
JavaScript 前端开发
如何在项目中集成 Babel?
如何在项目中集成 Babel?
46 3
|
2月前
|
缓存 JSON 监控
如何在项目中保证 Web 组件化的性能
保证 Web 组件化的性能需要从多个方面入手,综合运用各种优化方法和策略。通过持续的优化和改进,能够提高组件化的整体性能,为用户提供更好的体验,同时也有助于提高项目的开发效率和质量。
51 8
|
2月前
|
存储 前端开发 JavaScript
如何在项目中高效地进行 Web 组件化开发
高效地进行 Web 组件化开发需要从多个方面入手,通过明确目标、合理规划、规范开发、加强测试等一系列措施,实现组件的高效管理和利用,从而提高项目的整体开发效率和质量,为用户提供更好的体验。
42 7
|
2月前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
51 2
|
2月前
|
监控 安全 测试技术
如何在实际项目中应用Python Web开发的安全测试知识?
如何在实际项目中应用Python Web开发的安全测试知识?
40 4
|
2月前
|
中间件 Go API
Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架
本文概述了Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架。
163 1
|
2月前
|
JavaScript 前端开发 开发工具
web项目规范配置(husky、eslint、lint-staged、commit)
通过上述配置,可以确保在Web项目开发过程中自动进行代码质量检查和规范化提交。Husky、ESLint、lint-staged和Commitlint共同作用,使得每次提交代码之前都会自动检查代码风格和语法问题,防止不符合规范的代码进入代码库。这不仅提高了代码质量,还保证了团队协作中的一致性。希望这些配置指南能帮助你建立高效的开发流程。
77 5
|
3月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
208 3
|
1月前
|
前端开发 安全 JavaScript
2025年,Web3开发学习路线全指南
本文提供了一条针对Dapp应用开发的学习路线,涵盖了Web3领域的重要技术栈,如区块链基础、以太坊技术、Solidity编程、智能合约开发及安全、web3.js和ethers.js库的使用、Truffle框架等。文章首先分析了国内区块链企业的技术需求,随后详细介绍了每个技术点的学习资源和方法,旨在帮助初学者系统地掌握Dapp开发所需的知识和技能。
2025年,Web3开发学习路线全指南
|
2月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
225 45

热门文章

最新文章