发表于: 2020-08-02 23:58:05

2 1428


要使用Tiles框架首先要导入Tiles的依赖jar包,但是导入Tiles的jar包里含有与其它jar包冲突的jar包

 

在导入Tiles框架的jar包时,这个jar包里含有的<commons-beanutils>jar包与其他jar包里含有的<conmons-beanutils>重复了,但是因版本不一致出现冲突了,所以要在<Tiles-extras>里用<exclusion>将<commons-beanutils>排除掉.具体代码如下:

然后删除重新下载补全了依赖

IDE Maven helper,该插件可以在你的pom文件中将冲突的jar包进行exclusion即排除操作,这样项目中重复的jar包和冲突的jar包问题就能有效减少了。

任务5

新增一个账户表

编写dao层service层

1.什么是jsp

jsp的全称为:java server pages(翻译:java服务器页面),既然它是java的服务器页面,则它能支持java的代码编写的web页面(.jsp后缀结尾的html文件)。

jsp<%, %>中编写java代码

可以在里面嵌入java的代码---->可以实现一些HTML无法的操作,EL表达式这样的

 

2.jsp有几个内置对象?

JSP共有以下9种基本内置对象:

1request 触发服务调用的请求

2response 对请求的应答

3session 为请求的客户创建的session对象

4application  servlet 配置对象获得的 servlet 上下文(如在getServletConfig() getContext()的调用中)

5out 向输出流写入内容的对象

6pageContext  JSP 的页面上下文

7page 实现处理本页当前请求的类的实例

8config  JSP  ServletConfig

9exception 表示JSP页面运行时产生的异常

 

4.为什么要使用tiles框架?

主要是实现代码复用,可以是项目更加的灵活,分成多个板块,这个相同的部分就可以用同一个展示,就不用那么多写重复的代码


了解了一下shiro (http://shiro.apache.org/spring.html)

<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<async-supported>true</async-supported>
<init-param>
   <param-name>targetFilterLifecycle</param-name>
   <param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"></bean>
        <!-- ShiroWeb过滤器 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- Shiro的安全管理器,所有关于安全的操作都会经过SecurityManager -->
<property name="securityManager" ref="securityManager"/>
<!-- 系统认证提交地址,如果用户退出即session丢失就会访问这个页面 -->
<property name="loginUrl" value="/login.jsp"/>
<!-- 权限验证失败跳转的页面,需要配合SpringExceptionHandler异常处理机制使用 -->
<property name="unauthorizedUrl" value="/unauthorized.jsp"/>
<property name="filters">
   <util:map>
       <entry key="authc" value-ref="formAuthenticationFilter"/>
   </util:map>
</property>
<!-- 自定义的过滤器链,从上向下执行,一般将`/**`放到最下面 -->
<property name="filterChainDefinitions">
   <value>
       <!-- 静态资源不拦截 -->
       /static/** = anon
/lib/** = anon
/js/** = anon

<!-- 登录页面不拦截 -->
       /login.jsp = anon
/login.do = anon

<!-- Shiro提供了退出登录的配置`logout`,会生成路径为`/logout`的请求地址,访问这个地址即会退出当前账户并清空缓存 -->
       /logout = logout

<!-- user表示身份通过或通过记住我通过的用户都能访问系统 -->
       /index.jsp = user

<!-- `/**`表示所有请求,表示访问该地址的用户是身份验证通过或RememberMe登录的都可以 -->
       /** = user
</value>
</property>
</bean>

       <!-- 基于Form表单的身份验证过滤器 -->
<bean id="formAuthenticationFilter" class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">
<property name="usernameParam" value="username"/>
<property name="passwordParam" value="password"/>
<property name="loginUrl" value="/login.jsp"/>
</bean>

       <!-- 安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="userRealm"/>
</bean>

       <!-- Realm实现 -->
<bean id="userRealm" class="cn.tycoding.realm.UserRealm"></bean>

Shiro实现身份认证

身份认证的流程

1.如果用户为登录,将跳转到loginUrl进行登录,登录表单中,包含了两个主要参数:用户名username、密码password(这两个参数名称不是固定的,但是要和FormAuthenticationFilter表单过滤器的参数配置要对应)。

2.用户输入这两个用户名和密码后提交表单,通过绑定了SecurityManager的SecurityUtils得到Subject实例,然后获取身份验证的UsernamePasswordToken传入用户名和密码。

3.调用subject.login(token)进行登录,SecurityManager会委托Authenticator把相应的token传给Realm,从Realm中获取身份认证信息。

4.Realm可以是自己实现的Realm,Realm会根据传入的用户名和密码去数据库进行校验(提供Service层登录接口)。

5.Shiro从Realm中获取安全数据(如用户、身份、权限等),如果校验失败,就会抛出异常,登录失败;否则就登录成功。

@Controller
public class LoginController {
@RequestMapping("/login")
public String login(
@RequestParam(value = "username", required = false) String username,
           @RequestParam(value = "password", required = false) String password,
           Model model) {
String error = null;
       if (username != null && password != null) {
//初始化
           Subject subject = SecurityUtils.getSubject();
           UsernamePasswordToken token = new UsernamePasswordToken(username, password);
           try {
//登录,即身份校验,由通过Spring注入的UserRealm会自动校验输入的用户名和密码在数据库中是否有对应的值
               subject.login(token);
               return "redirect:index.do";
           }catch (Exception e){
e.printStackTrace();
               error = "未知错误,错误信息:" + e.getMessage();
           }
} else {
error = "请输入用户名和密码";
       }
//登录失败,跳转到login页面,这里不做登录成功的处理,由
       model.addAttribute("error", error);
       return "login";
   }
}

还没跑通

明日计划 任务5

今日问题 暂无


返回列表 返回列表
评论

    分享到