智能销售系统阶段一完善(懒加载Bug、主页面、shiro认识)

配置懒加载三个Bug的处理

(no Session、No serializer、n to n)

一:no Session

1.配置懒加载
在这里插入图片描述
2.前台执行查询,报错:
没有回话(原因:数据库进行操作,如果EntityManager已经被Spring关闭,前台展示查询的时候:no Session ,即关闭太早了)
在这里插入图片描述
3.解决:配置 过滤器 (发出请求创建EM,响应完后关闭EM)
web.xml:

<!--配置过滤器(Spring为我们写好的:让我们EntityManager对象在页面展示完后再关闭)-->
  <filter>
    <filter-name>openEntityManager</filter-name>
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>openEntityManager</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

二:No serializer

1.前台再次执行查询,第二个错误:没有序列化
在这里插入图片描述
2.解决:
方式一:@JsonIgnoreProperties
在这里插入图片描述
@JsonIgnoreProperties Ignore:忽略 Properties:参数 (生成json时需要忽略的参数)
原因:department 中原本的两个字段:id 、name 都是序列化的(数据类型…)
department配置懒加载后 ===》 proxy (它还是有department中的字段,为了实现代理的增强功能,hibernate为代理对象添加了无法序列化的属性,所有我们要 忽视这些属性,如图中属性)
在这里插入图片描述
JPA需要这些属性,但是前台不需要,故忽略掉就是序列化的值。
链接推荐:
使用JPA 通过ID获取对象时报错No serializer found for class org.hibernate.proxy. …link.

方式二:重写了原生的映射关系
准备类:
注意extends ObjectMapper

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

//重写了原生的映射关系
public class CustomMapper extends ObjectMapper {
    public CustomMapper() {
        this.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        // 设置 SerializationFeature.FAIL_ON_EMPTY_BEANS 为 false
        this.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
    }
}

配置Spring-mvc:

<!-- Spring MVC 配置 -->
    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>application/json; charset=UTF-8</value>
                        <value>application/x-www-form-urlencoded; charset=UTF-8</value>
                    </list>
                </property>
                <!-- No serializer:配置 objectMapper 为我们自定义扩展后的 CustomMapper,解决了返回对象有关系对象的报错问题 -->
                <property name="objectMapper">
                    <bean class="com.hujie.aisell.common.CustomMapper"></bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

三:N to N (不能改id)

原因:持久化对象的id不能修改
情景修改员工信息(什么时候修改了id?部门什么时候变成了持久化对象)分析:
在这里插入图片描述
解决:将关联的持久化对象设置为null(就是我们后台查的employee设为null)
EmployeeController中:

@ModelAttribute("editEmployee")
    public Employee beforeUpdate(Long id,String _cmd){
        if(id!=null && "update".equals(_cmd)){
            //修改时才去数据库获取
            Employee tempEmp = employeeService.findOne(id);
            //把关连对象设置为null,可以解决n-to-n问题
            tempEmp.setDepartment(null);
            return tempEmp;
        }
        return null;
    }

主页面(EasyUI)

准备controller层,返回到主页

结构&菜单
<%--头部--%>
    <div data-options="region:'north'" style="height:90px;">
        <h1>A I SELL系统</h1>
    </div>
    <%--树菜单--%>
    <div data-options="region:'west',title:'菜单',split:true" style="width:210px;">
        <%--菜单 、设置id以便使用Javascript加载数据--%>
        <ul id="menuTree"></ul>
    </div>
    <%--主体 选项卡--%>
    <div id="mainTabs" class="easyui-tabs" data-options="region:'center'">
        <%--添加选项卡(首页按理都应该在,所以直接加)--%>
        <div title="首页" style="padding:20px;display:none;">
            主页面
        </div>
    </div>
     <%--引入EasyUI--%>
    <%@ include file="/WEB-INF/views/head.jsp" %>
	<script>
        $(function () {
            //创建菜单树
            $('#menuTree').tree({
                /*菜单树数据来源*/
                url:'/json/menu_tree_data.json',
	</script>
页面&选项卡
<script>
        $(function () {
            //创建菜单树
            $('#menuTree').tree({
                /*菜单树数据来源*/
                url:'/json/menu_tree_data.json',
                //node点击的节点,通过节点完善选项卡功能(打开关闭)
                onClick: function(node){
                    //通过节点拿到路径(路径存在才做跳转)
                    var url = node.url;
                    if(url){
                        //拿到节点的名称:即将操作的选项卡名称
                        var tabName = node.text;

                        //根据名称去拿选项卡,如果有已经打开的选项卡,直接选中(而不是新打开) 位置:主题中
                        var tabs = $('#mainTabs').tabs("getTab",tabName);
                        if(tabs){
                            //存在就选中
                            $('#mainTabs').tabs("select",tabName);
                        }else{
                            //不存在添加新的选项卡面板
                            $('#mainTabs').tabs('add',{
                                //现象卡标题名称
                                title:tabName,
                                //选项卡中内容 及 选项卡样式
                                content:'<iframe src="'+url+'" frameborder="0" style="width: 100%;height: 100%"></iframe>',
                                //选项卡 是否可以关闭
                                closable:true
                            });
                        }
                    }
                }
            });
        })
    </script>

权限框架:Shiro认识

基于角色的访问控制(Role-Based Access Control)在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。
在这里插入图片描述

Shiro认识

Apache Shiro是一个强大且易用的Java安全框架,有身份验证授权密码学会话管理

在这里插入图片描述
Security与Shiro区别:控制权限的粒度不同(security更细)

Shiro四大基石

身份验证授权密码学会话管理
在这里插入图片描述

Shiro架构

宏观角度(外部角度,应用角度看Shiro)
在这里插入图片描述

在这里插入图片描述
微观(Shiro内部看)
在这里插入图片描述

Shiro入门

导包
<dependencies>
        <!--shiro的核心支持包-->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <version>1.4.0</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
Quickstart

shior.ini:
(# 号后的就是注释)

# -----------------------------------------------------------------------------
#该文件:用户、角色、权限、资源
# users:代表下面的都是用户
# root角色名 123456:密码   amdin:角色
# -----------------------------------------------------------------------------
[users]
root = 123456 , amdin
guest = guest , guest
gu = 123456 , it
# -----------------------------------------------------------------------------
# Roles 角色   (这里角色和资源一起的)
# admin = *     admin角色可以做任何事情
# save后多一个:   (指向更多资源)
#   it = employee:save  it部门可以添加员工
# -----------------------------------------------------------------------------
[roles]
admin = *
guest = employee:*
it = employee:save

测试:

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.junit.Test;

public class ShoirTest {

    @Test
    public void testHello() throws Exception{
        /**获取权限工厂(为获取权限管理器) 直接拷贝Quickstart中代码(导包问题)
         * 1.读取了shiro.ini配置文件(封装好了realm的支持)
         * 2.拿到一个工厂对象(它就可以创建SecurityManager)
         */
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        //3.获取SecurityManager对象(包含shiro中的所有功能)
        SecurityManager securityManager = factory.getInstance();
        //4.把SecurityManager对象放到工具中
        /**
         * 把SecurityManager交给工具,之后就可以直接使用它
         * 所以后面通常直接使用工具
         */
        SecurityUtils.setSecurityManager(securityManager);
        //5.拿到当前用户(可能是游客,后面验证登录)          如果要使用会话的话  subject.getSession();
        Subject subject = SecurityUtils.getSubject();

        //验证是否登录
        System.out.println("是否登录:"+subject.isAuthenticated());

        /*
        * 登录部分
        * */
        //6.没有登录的话,让它登录
        if (!subject.isAuthenticated()){
            // 6.1准备令牌(用户名密码令牌)  因为登录login(); 要传入令牌,可见两接口下只有一个令牌:UsernamePasswordToken "root","123456"为我们配置的ini中的数据
            UsernamePasswordToken token = new UsernamePasswordToken("root","123456");
            // 6.2进行登录
            subject.login(token);
        }

        //验证是否登录
        System.out.println("是否登录:"+subject.isAuthenticated());
    }
}
发布了8 篇原创文章 · 获赞 0 · 访问量 88
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览