SSM+Shiro纯代码分享(ReviewSSM)

包结构

src-main-com-controller/entity/mapper/MyException/MyFilter/realm/service

resources-applicationContext-mapper.xml/applicationContext-mvc.xml/applicationContext-service.xml/applicationContext-web.xml/applicationContext-shiro.xml/jdbc.properties/mybatis-config.xml

webapp-static/WEB-INF-html/web.xml

pom.xml

java

controller.ProductController

package com.itqf.controller;

import com.github.pagehelper.PageInfo;
import com.itqf.entity.Product;
import com.itqf.entity.Users;
import com.itqf.service.ProductService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.omg.CORBA.PUBLIC_MEMBER;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;

import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Controller
@SessionAttributes(names = "users")
public class ProductController {

@Autowired
private ProductService productService;

//查询所有
@RequestMapping("/list")
@ResponseBody
public PageInfo<Product> showProduct(@RequestParam(defaultValue = "1")int currentPage,
                                     @RequestParam(defaultValue = "3")int pageSize,
                                     @RequestParam(defaultValue = "")String pname){
    PageInfo<Product> productPageInfo = productService.selectAllProductByPname(pname,currentPage,pageSize);
    return productPageInfo;
}

//获取遍历页面
@RequestMapping("/getAll")
public String getAll(){
    return "product_show";
}

//获取首页
@RequestMapping("/")
public String getIndex(){
    return "login";
}

//获取添加页面
@RequestMapping("/getInsert")
public String getInsert(){
    return "product_insert";
}

//执行添加操作
@RequestMapping("/insert")
@ResponseBody
public Map insert(Product product){
    int i = productService.insertProduct(product);
    Map<String,Integer> map = new HashMap<>();
    if (i != 0){
        map.put("code",1);
        return map;
    }
    map.put("code",0);
    return map;
}

//删除
@RequestMapping("/delete")
@ResponseBody
public Map delete(int pid){
    int i = productService.deleteProduct(pid);
    Map<String,Integer> map = new HashMap<>();
    if (i != 0){
        map.put("code",1);
        return map;
    }
    map.put("code",0);
    return map;
}

//获取修改页面
@RequestMapping("/getUpdate")
public String getUpdate(int pid, HttpServletRequest request){
    //if (!StringUtils.isEmpty(request.getSession().getAttribute("pid"))){
    //    request.getSession().removeAttribute("pid");
    //}
    request.getSession().setAttribute("pid",pid);
    return "product_update";
}

//查询具体信息
@RequestMapping("/getProduct")
@ResponseBody
public Product getProduct(HttpServletRequest request){
    int pid = (int)request.getSession().getAttribute("pid");
    return productService.selectProduct(pid);
}

//修改信息
@RequestMapping("/update")
@ResponseBody
public Map update(Product product){
    int i = productService.updateProduct(product);
    Map<String,Integer> map = new HashMap<>();
    if (i != 0){
        map.put("code",1);
        return map;
    }
    map.put("code",0);
    return map;
}

//登录页面
@RequestMapping("/getLogin")
public String getLogin(){
    return "login";
}

//登录
@RequestMapping("/login")
@ResponseBody
public Map login(Users users, int rem, Model model){
    UsernamePasswordToken token = new UsernamePasswordToken(users.getUsername(),users.getPassword());
    System.out.println(rem);
    if (rem == 1){
        token.setRememberMe(true);
    }
    Subject subject = SecurityUtils.getSubject();
    Map<String,Integer> map = new HashMap<>();
    try {
        subject.login(token);
        Users loginUser = (Users) subject.getPrincipal();
        model.addAttribute("users",loginUser);
        map.put("code",1);
        return  map;
    } catch (AuthenticationException e) {
        e.printStackTrace();
        model.addAttribute("msg","认证失败");
    }
    map.put("code",0);
    return map;
}

@RequestMapping("/403")
public String jump403(){
    return "403";
}

@RequestMapping("/logout")
public String logout(){
    Subject subject = SecurityUtils.getSubject();
    if (subject != null){
        subject.logout();
    }
    return "redirect:/getLogin";
}
}

entity.Menus

package com.itqf.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.io.Serializable;

@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Menus implements Serializable {

private Integer mId;

private String mName;

private String mUrl;

}

entity.Product

package com.itqf.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;

@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Product implements Serializable {

private Integer pid;
private String pname;
private String marketPrice;
private String shopPrice;
private String pimage;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date pdate;
private String pdesc;

}

entity.RoleMenu

package com.itqf.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.io.Serializable;

@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class RoleMenu implements Serializable {

private Integer rmId;

private Integer rId;

private Integer mId;

}

entity.Rolels

package com.itqf.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.io.Serializable;
import java.util.List;

@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Roles implements Serializable {

private Integer rId;

private String rName;

private List<Menus> menus;

}

entity.UserRole

package com.itqf.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.io.Serializable;

@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class UserRole implements Serializable {

private Integer urId;

private Integer uId;

private Integer rId;

}

entity.Users

package com.itqf.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.io.Serializable;
import java.util.List;

@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Users implements Serializable {

private Integer uId;

private String username;

private String salt;

private String password;

private List<Roles> roles;

}

mapper.ProductMapper

package com.itqf.mapper;

import com.itqf.entity.Product;
import org.apache.ibatis.annotations.Param;

import java.util.List;
public interface ProductMapper {

//通过商品名查询所有商品
List<Product> selectAllProductByPname(@Param("pname")String pname);

//添加商品
int insertProduct(Product product);

//删除商品
int deleteProduct(int pid);

//查询商品信息
Product selectProduct(int pid);

//修改商品
int updateProduct(Product product);

}

mapper.ProducctMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itqf.mapper.ProductMapper">

<!--//通过商品名查询所有商品-->
<!--List<Product> selectAllProductByPname(@Param("pname") String pname);-->
<select id="selectAllProductByPname" resultType="product">
    select * from product
    <where>
        <if test="pname != null and pname != ''">
            pname like "%"#{pname}"%"
        </if>
    </where>
</select>

<!--//添加商品-->
<!--int insertProduct(Product product);-->
<insert id="insertProduct" parameterType="product" useGeneratedKeys="true" keyProperty="pid">
    insert into product (pname, market_price, shop_price, pimage, pdate, pdesc)
    values (#{pname}, #{marketPrice}, #{shopPrice}, #{pimage}, #{pdate}, #{pdesc})
</insert>

<!--//删除商品-->
<!--int deleteProduct(int pid);-->
<delete id="deleteProduct">
    delete from product where pid = #{pid}
</delete>

<!--//查询商品信息-->
<!--Product selectProduct(int pid);-->
<select id="selectProduct" resultType="product">
    select *  from product where pid = #{pid}
</select>

<!--//修改商品-->
<!--int updateProduct(Product product);-->
<update id="updateProduct" parameterType="product">
    update product
    <set>
        <if test="pname != null and pname != ''">
            pname = #{pname}
        </if>
        <if test="marketPrice != null and marketPrice != ''">
            ,market_price = #{marketPrice}
        </if>
        <if test="shopPrice != null and shopPrice != ''">
            ,shop_price = #{shopPrice}
        </if>
        <if test="pimage != null and pimage != ''">
            ,pimage = #{pimage}
        </if>
        <if test="pdate != null">
            ,pdate = #{pdate}
        </if>
        <if test="pdesc != null and pdesc != ''">
            ,pdesc = #{pdesc}
        </if>
    </set>
    where pid = #{pid}
</update>

</mapper>

mapper.UsersMapper

package com.itqf.mapper;

import com.itqf.entity.Users;

import java.util.Set;

public interface UsersMapper {

//查权限角色
Users selectUsersAndRolesAndPermissions(String username);

//查角色
Set<String> selectRolesByUsername(String username);

//查权限
Set<String> selectPermissionsByRoles(Set<String> roles);

}

mapper.UsersMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itqf.mapper.UsersMapper">

<resultMap id="BaseResultMap" type="com.itqf.entity.Users">
    <id column="u_id" jdbcType="INTEGER" property="uId"/>
    <result column="username" jdbcType="VARCHAR" property="username"/>
    <result column="salt" jdbcType="VARCHAR" property="salt"/>
    <result column="password" jdbcType="VARCHAR" property="password" />
</resultMap>

<!--//查权限角色-->
<!--Users selectUsersAndRolesAndPermissions(String username);-->
<resultMap id="usermap" type="users">
    <id property="uId" column="u_id"/>
    <collection property="roles" ofType="roles">
        <id column="rId" property="r_id"/>
        <collection property="menus" ofType="menus">
            <id property="mId" column="m_id" />
        </collection>
    </collection>
</resultMap>
<select id="selectUsersAndRolesAndPermissions" resultMap="usermap">
    select u.*,r.*,m.*
    from users u join user_role ur on u.u_id = ur.u_id
    join roles r on ur.r_id = r.r_id
    join role_menu rm on rm.r_id = r.r_id
    join menus m on rm.m_id = m.m_id
    where u.username = #{username}
</select>

<!--//查角色-->
<!--Set<String> selectRolesByUsername(String username);-->
<select id="selectRolesByUsername" resultType="String">
    select r.r_name
    from users u join user_role ur on u.u_id = ur.u_id
    join roles r on ur.r_id = r.r_id
    where u.username = #{username}
</select>

<!--//查权限-->
<!--Set<String> selectPermissionsByRoles(Set<String> roles);-->
<select id="selectPermissionsByRoles" resultType="String">
    select  m.m_name
    from roles r join role_menu rm on r.r_id = rm.r_id
    join menus m on rm.m_id = m.m_id
    where r.r_name in
    <foreach collection=" collection" open="(" close=")" separator="," item="rname">
        #{rname}
    </foreach>
</select>
</mapper>

MyException.UnanthExceptionHandler

package com.itqf.MyException;

import org.apache.shiro.authz.UnauthorizedException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

@ControllerAdvice
public class UnauthExceptionHandler {

@ExceptionHandler(UnauthorizedException.class)
public ModelAndView handleException(UnauthorizedException ex){
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("403");
    modelAndView.addObject("msg","权限验证失败!");
    return modelAndView;
}
}

MyFilter.RolesOrFilter

package com.itqf.MyFilter;

import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authz.AuthorizationFilter;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class RolesOrFilter extends AuthorizationFilter {
@Override
protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception {
    //1.获取subject
    Subject subject = getSubject(servletRequest, servletResponse);
    //2.获取参数
    String[] roles = (String[])o;
    if (roles == null && roles.length ==0){
        return true;
    }
    for (String role : roles) {
        if (subject.hasRole(role)){
            return true;
        }
    }
    return false;
}
}

realm.MyRealm

package com.itqf.realm;

import com.itqf.entity.Users;
import com.itqf.service.UsersService;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Set;

public class MyRealm extends AuthorizingRealm {

@Autowired
private UsersService usersService;

@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
    Users users = (Users)principalCollection.getPrimaryPrincipal();
    Set<String> roles = usersService.selectRolesByUsername(users.getUsername());
    System.out.println("roles = " + roles);
    Set<String> permissions = usersService.selectPermissionsByRoles(roles);
    System.out.println("permissions = " + permissions);
    SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
    simpleAuthorizationInfo.setRoles(roles);
    simpleAuthorizationInfo.setStringPermissions(permissions);
    return simpleAuthorizationInfo;
}

@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
    String username = (String)authenticationToken.getPrincipal();
    Users users = usersService.selectUsersAndRolesAndPermissions(username);
    System.out.println("users = " + users);
    if (users == null){
        return null;
    }else {
        System.out.println(ByteSource.Util.bytes(users.getSalt()));
        SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(users,users.getPassword(), ByteSource.Util.bytes(users.getSalt()),"MyRealm");
        return simpleAuthenticationInfo;
    }
}
}

service.ProductService

package com.itqf.service;

import com.github.pagehelper.PageInfo;
import com.itqf.entity.Product;

import java.util.List;

public interface ProductService {

//通过商品名查询所有商品
PageInfo<Product> selectAllProductByPname(String pname,int currentPage,int pageSize);

//添加商品
int insertProduct(Product product);

//删除商品
int deleteProduct(int pid);

//查询商品信息
Product selectProduct(int pid);

//修改商品
int updateProduct(Product product);
}

service.UsersService

package com.itqf.service;
import com.itqf.entity.Users;
import java.util.Set;

public interface UsersService {

//查权限角色
Users selectUsersAndRolesAndPermissions(String username);

//查角色
Set<String> selectRolesByUsername(String username);

//查权限
Set<String> selectPermissionsByRoles(Set<String> roles);

}

service.ProductServiceImpl

package com.itqf.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.itqf.entity.Product;
import com.itqf.mapper.ProductMapper;
import com.itqf.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional
public class ProductServiceImpl implements ProductService {

@Autowired
private ProductMapper productMapper;

@Override
public PageInfo<Product> selectAllProductByPname(String pname,int currentPage,int pageSize) {
    PageHelper.startPage(currentPage,pageSize);
    List<Product> list = productMapper.selectAllProductByPname(pname);
    return new PageInfo<>(list);
}

@Override
public int insertProduct(Product product) {
    return productMapper.insertProduct(product);
}

@Override
public int deleteProduct(int pid) {
    return productMapper.deleteProduct(pid);
}

@Override
public Product selectProduct(int pid) {
    return productMapper.selectProduct(pid);
}

@Override
public int updateProduct(Product product) {
    return productMapper.updateProduct(product);
}
}

service.UsersServiceImpl

package com.itqf.service.impl;

import com.itqf.entity.Users;
import com.itqf.mapper.UsersMapper;
import com.itqf.service.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Set;

@Service
public class UsersServiceImpl implements UsersService {

@Autowired
private UsersMapper usersMapper;

@Override
public Users selectUsersAndRolesAndPermissions(String username) {
    return usersMapper.selectUsersAndRolesAndPermissions(username);
}

@Override
public Set<String> selectRolesByUsername(String username) {
    return usersMapper.selectRolesByUsername(username);
}

@Override
public Set<String> selectPermissionsByRoles(Set<String> roles) {
    return usersMapper.selectPermissionsByRoles(roles);
}
}

resources

applicationContext-mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

   <!-- 1.初始化c3p0连接池-->
   <context:property-placeholder location="classpath:jdbc.properties" />

   <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
         <property name="driverClass" value="${driver}" />
         <property name="jdbcUrl" value="${url}" />
         <property name="password" value="${password}" />
         <property name="user" value="${user}" />
   </bean>

  <!-- spring 整合mybatis-->
   <!-- sqlsession -->
  <bean id="sqlsessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!--核心配置文件传给了sqlsessionfactory -->
        <property name="configLocation" value="classpath:mybatis-config.xml" />
  </bean>

  <!-- mapper扫描所有mapper  -->
  <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
         <property name="sqlSessionFactoryBeanName" value="sqlsessionFactory" />
         <property name="basePackage" value="com.itqf.mapper" />
  </bean>
</beans>

applicationContext-mvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:mvc="http://www.springframework.org/schema/mvc"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

   <!-- handler controller handlermapping handleradataer
        视图解析器

        json转化器  静态资源处理器
        文件上传解析器
        拦截器配置
        cros跨域同源策略设置
    -->
    <context:component-scan base-package="com.itqf.controller">
          <!--<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>-->
    </context:component-scan>

    <mvc:annotation-driven  />

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
          <property name="prefix" value="/WEB-INF/html/" />
          <property name="suffix" value=".html" />
    </bean>


    <mvc:default-servlet-handler />

	<!--        <mvc:interceptors>-->
	<!--            -->
	<!--        </mvc:interceptors>-->

    <bean  id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
          <property name="defaultEncoding" value="UTF-8" />
    </bean>


    <mvc:cors>
        <mvc:mapping path="/**"
                     allowed-origins="*"
                     allowed-methods="POST, GET, OPTIONS, DELETE, PUT,PATCH"
                     allowed-headers="Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"
                     allow-credentials="true" />
    </mvc:cors>
</beans>

applicationContext-service.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">

   <context:component-scan base-package="com.itqf.service" />

    <!-- 扫描业务层
         自定义增强:
         spring tx
     -->

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
           <property name="dataSource" ref="dataSource" />
    </bean>

    <tx:advice id="advice" transaction-manager="transactionManager">
         <tx:attributes>
             <!-- dql -->
             <tx:method name="find*" isolation="READ_COMMITTED" timeout="30" read-only="true" propagation="SUPPORTS"/>
             <tx:method name="select*" isolation="READ_COMMITTED" timeout="30"  read-only="true" propagation="SUPPORTS"/>
             <tx:method name="query*" isolation="READ_COMMITTED"  timeout="30" read-only="true" propagation="SUPPORTS" />
             <tx:method name="search*" isolation="READ_COMMITTED"  timeout="30" read-only="true" propagation="SUPPORTS" />
             <tx:method name="show*" isolation="READ_COMMITTED"  timeout="30" read-only="true" propagation="SUPPORTS" />
             <tx:method name="get*" isolation="READ_COMMITTED"  timeout="30" read-only="true" propagation="SUPPORTS" />
             <tx:method name="have*" isolation="READ_COMMITTED"  timeout="30" read-only="true" propagation="SUPPORTS" />
             <tx:method name="cha*" isolation="READ_COMMITTED"  timeout="30" read-only="true" propagation="SUPPORTS" />

             <!-- dml -->
             <tx:method name="insert*" isolation="READ_COMMITTED"  timeout="30" read-only="false" propagation="REQUIRED" />
             <tx:method name="add*" isolation="READ_COMMITTED"  timeout="30" read-only="false" propagation="REQUIRED" />
             <tx:method name="post*" isolation="READ_COMMITTED"  timeout="30" read-only="false" propagation="REQUIRED" />
             <tx:method name="save*" isolation="READ_COMMITTED"  timeout="30" read-only="false" propagation="REQUIRED" />

             <tx:method name="update*" isolation="READ_COMMITTED"  timeout="30" read-only="false" propagation="REQUIRED" />
             <tx:method name="modify*" isolation="READ_COMMITTED"  timeout="30" read-only="false" propagation="REQUIRED" />
             <tx:method name="change*" isolation="READ_COMMITTED"  timeout="30" read-only="false" propagation="REQUIRED" />
             <tx:method name="flush*" isolation="READ_COMMITTED"  timeout="30" read-only="false" propagation="REQUIRED" />
             <tx:method name="sub*" isolation="READ_COMMITTED"  timeout="30" read-only="false" propagation="REQUIRED" />

             <tx:method name="delete*" isolation="READ_COMMITTED"  timeout="30" read-only="false" propagation="REQUIRED" />
             <tx:method name="remove*" isolation="READ_COMMITTED"  timeout="30" read-only="false" propagation="REQUIRED" />
             <tx:method name="drop*" isolation="READ_COMMITTED"  timeout="30" read-only="false" propagation="REQUIRED" />

             <tx:method name="*" isolation="READ_COMMITTED" />

         </tx:attributes>
    </tx:advice>

    <aop:config>
          <aop:pointcut id="pc" expression="execution(* com..servic.impl.*Impl.*(..))"/>
          <aop:advisor advice-ref="advice" pointcut-ref="pc" />
    </aop:config>
</beans>

applicationContext-web.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:mvc="http://www.springframework.org/schema/mvc"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">


  <context:component-scan base-package="com.itqf.controller" >

  </context:component-scan>

  <mvc:annotation-driven />

  <mvc:default-servlet-handler />

  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/html/" />
        <property name="suffix" value=".html" />
  </bean>

  <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="UTF-8" />
  </bean>

<mvc:cors>
    <mvc:mapping path="/**"
                 allowed-origins="*"
                 allowed-methods="POST, GET, OPTIONS, DELETE, PUT,PATCH"
                 allowed-headers="Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"
                 allow-credentials="true" />
</mvc:cors>
</beans>

applicationContext-shiro.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


<!-- realm secritymanager -->

<!--创建加密matcher-->
<bean id="matcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
    <property name="hashAlgorithmName" value="MD5" />
    <property name="hashIterations" value="18" />
</bean>

<!-- realm -->
<bean id="myrealm" class="com.itqf.realm.MyRealm">
     <!-- 密码匹配-->
    <property name="credentialsMatcher" ref="matcher" />
</bean>

<!--&lt;!&ndash; 自定义退出登陆 &ndash;&gt;-->
<!--<bean id="logout" class="org.apache.shiro.web.filter.authc.LogoutFilter">-->
<!--      <property name="redirectUrl" value="/getLogin" />-->
<!--</bean>-->

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
      <property name="realm" ref="myrealm" />
      <!-- 记录账号-->
      <property name="rememberMeManager" ref="rememberMeManager" />
</bean>

<!--记住我-->
<bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
    <property name="cookie" ref="cookie1" />
</bean>
<!--  rememberme记录需要设置cookie-->
<bean  id="cookie1" class="org.apache.shiro.web.servlet.SimpleCookie" >
    <!--通过构造方法的方式设置cookie的name属性-->
    <constructor-arg value="rebcookie"   />
    <property name="httpOnly" value="true" />
    <!--<property name="maxAge"  value="-1" /> 代表浏览器关闭 cookie也就销毁-->
    <!-- 正值代表秒 60分钟-->
    <property name="maxAge" value="60" />
    <property name="path"  value="/" />
</bean>

<!--自定义orRoles-->
<bean id="orroles" class="com.itqf.MyFilter.RolesOrFilter"/>

<!-- 过滤器-->
<!-- 授权管理 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">

    <property name="securityManager" ref="securityManager" />
    <!-- 配置登陆页面 认证不通过的!会自动跳转到登陆页面
         没有认证的
    -->
    <property name="loginUrl" value="/getLogin" />

    <!-- 页面要求授权 但是没有授权的!-->
    <property name="unauthorizedUrl" value="/403" />

    <!--引入自定义orRoles-->
    <property name="filters">
        <map>
            <entry key="orr" value-ref="orroles"/>
        </map>
    </property>

    <property name="filterChainDefinitions">
        <value>
	<!--              登陆页面和退出登陆,403,程序的首页 /  匿名资源 不需要认证就可以登陆!

              首页需要认证才能访问!

              商品展示页面 需要认证才可以访问!

				LogoutFilter

              商品添加页面  需要授权 role 管理员
	 -->
            /getLogin=anon
            /login=anon
            /403=anon
            /=anon
            <!-- 静态资源  匿名资源-->
            /layui/**=anon
            /static/**=anon
			<!--                认证过才放行
             roles【1,2】同时需要拥有两个角色才可以访问 ! and的关系
			 -->
            /getInsert=roles[卖家]
            /insert=roles[卖家]
            /getUpdate=roles[卖家]
            /getProduct=roles[卖家]
            /update=roles[卖家]
            /delete=roles[卖家]
            /getLayui=roles[买家]
            /layuiShow=roles[买家]
            /**=authc
            /*.*=authc
        </value>
    </property>
</bean>
</beans>

jdbc.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql:///store2
user=root
password=dong1995

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置mybati的核心属性-->
<!--读取外部的配置文件,或者直接声明外部配置文件 -->
<settings>
    <!-- 告诉mybatis开启后台的sql语句输出!
     -->
    <setting name="logImpl" value="STDOUT_LOGGING"/>
    <setting name="returnInstanceForEmptyRow" value="false"/>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
    <setting name="autoMappingBehavior" value="FULL"/>
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="true"/>
    <!-- 二级缓存第一层大闸开启 默认就是开启 -->
    <setting name="cacheEnabled" value="true"/>
</settings>

<typeAliases>
      <!-- 指定具体的类起别名 -->
		<!--        <typeAlias type="com.com.itqf.entity.Account" alias="account" />-->
      <!-- 给包下的所有类起别名 默认:类的首字母小写  XxXx xxXx -->
      <!-- 不想用默认命名  @Alias  一定要加载package - name对应的包的类中-->
      <package name="com.itqf.entity"/>

</typeAliases>

<plugins>
    <!--<plugin interceptor="com.github.pagehelper.PageHelper">-->
    <!--    <property name="dialect" value="mysql"/>-->
    <!--</plugin>-->
    <!--5.0版本pagehelper-->
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <property name="helperDialect" value="mysql"/>
    </plugin>
</plugins>

</configuration>

webapp

WEB-INF-html

403.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9; IE=8; IE=7; IE=EDGE"/>
<title>商城展示403</title>
<link rel="stylesheet" href="/css/index.css" type="text/css"/>
<link href="/css/layui.css" rel="stylesheet" type="text/css"/>
<script src="/js/common/jquery-1.8.3.js" type="text/javascript"></script>
<script src="/js/layui.js" type="text/javascript"></script>


<style type="text/css">
    html,body{
        height: 100%;
        width: 100%;
    }
</style>

</head>
<body>

<div class="container" style="height: 100%">
<div>
    <h1 style="text-align: center;color: red">您没有权限!</h1>
</div>
</body>
</html>

layui_show.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>table模块快速使用</title>
<link rel="stylesheet" href="/layui/css/layui.css" media="all">
</head>
<body style="width: 80%;margin: 0 auto;">

<div>
<h1 style="color: orange;text-align: center">Layui风格数据展示页面</h1>
<hr style="color: red">
<hr style="color: red">
<br>
<table id="demo" lay-filter="test"></table>
</div>

<script src="/layui/layui.js"></script>
<script>
layui.use('table', function(){
    var table = layui.table;

    //第一个实例
    table.render({
        elem: '#demo'
        ,height: 312
        ,url: '/layuiShow' //数据接口
        ,page: true //开启分页
        ,cols: [[ //表头
            {type: 'checkbox', fixed: 'left'}
            ,{field:'pid',title: '产品id'}
            ,{field:'pname',title: '产品名称'}
            ,{field:'marketPrice',title: '市场价'}
            ,{field:'shopPrice',title: '超市售价'}
            ,{field:'pimage',title: '图片链接'}
            ,{field:'pdesc',title:'产品描述'}
            ,{fixed: 'right', title:'操作', toolbar: '#barDemo'}
        ]]
    });

});
</script>
</body>
</html>

login.html

<!-- 登录页面 -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录页面</title>
<script type="text/javascript" src="/static/js/jquery-1.11.0.js"></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.0.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row clearfix">
    <div style="margin-top: 100px;text-align: center">
        <h1 style="color: magenta">欢迎来到本商品交易系统</h1>
        <h1 style="color: magenta">请登陆!</h1>
    </div>
    <div class="col-md-12 column" style="margin: 0 auto;width: 70%;">
        <form class="form-horizontal" role="form" id="form">
            <div class="form-group">
                <label for="username" class="col-sm-2 control-label">用户名</label>
                <div class="col-sm-10">
                    <input type="text" name="username" class="form-control" id="username" />
                </div>
            </div>
            <div class="form-group">
                <label for="password" class="col-sm-2 control-label">密码</label>
                <div class="col-sm-10">
                    <input type="password" name="password" class="form-control" id="password" />
                </div>
            </div>
            <div class="form-group">
                <div class="col-sm-offset-2 col-sm-10">
                    <div class="checkbox">
                        <label><input type="checkbox" name="rem" id="rem" value="1"/>记住我</label>
                    </div>
                </div>
            </div>
            <div class="form-group">
                <div class="col-sm-offset-2 col-sm-10">
                    <button type="button" class="btn btn-default" onclick="login()">登陆</button>
                </div>
            </div>
        </form>
    </div>
</div>
</div>
</body>
<script type="text/javascript">

function login() {
    var data1 = $("#form").serialize();
    $.ajax({
        url:"/login",
        type:"post",
        data:data1,
        dataType:"json",
        success:function(data){
            if (data.code === 1){
                location.href="/getAll";
            } else {
                location.href="/getLogin";
            }
        }
    });
}

</script>
</html>

product_insert.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>添加</title>
<script type="text/javascript" src="/static/js/jquery-1.11.0.js"></script>
<script type="text/javascript" src="/static/js/bootstrap.js" ></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.0.1/css/bootstrap.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row clearfix">
    <div class="col-md-12 column">
        <h3 class="text-success" style="text-align: center">
            添加商品
        </h3>
        <form class="form-horizontal" role="form" id="form">
            <div class="form-group">
                <label for="pname" class="col-sm-2 control-label">商品名称</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="pname" name="pname"/>
                </div>
            </div>
            <div class="form-group">
                <label for="marketPrice" class="col-sm-2 control-label">市场价</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="marketPrice" name="marketPrice"/>
                </div>
            </div>
            <div class="form-group">
                <label for="shopPrice" class="col-sm-2 control-label">超市售价</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="shopPrice" name="shopPrice" />
                </div>
            </div>
            <div class="form-group">
                <label for="pimage" class="col-sm-2 control-label">图片</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="pimage" name="pimage"/>
                </div>
            </div>
            <div class="form-group">
                <label for="pdate" class="col-sm-2 control-label">上架日期</label>
                <div class="col-sm-10">
                    <input type="text"  class="form-control" id="pdate" name="pdate"/>
                </div>
            </div>
            <div class="form-group">
                <label for="pdesc" class="col-sm-2 control-label">商品描述</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="pdesc" name="pdesc"/>
                </div>
            </div>
            <div class="form-group">
                <div class="col-sm-offset-2 col-sm-10">
                    <button type="button" class="btn btn-default" onclick="add()">添加</button>
                    <button type="button" onclick="history.back();" class="btn btn-success">返回</button>
                </div>
            </div>
        </form>
    </div>
</div>
</div>
</body>
<script type="text/javascript">

function add() {
    var data = $("#form").serialize();
    $.ajax({
        url:"/insert",
        type:"post",
        data:data,
        dataType:"json",
        success:function (data) {
            if (data.code === 0){
                alert("添加失败!");
                location.href="/getInsert";
            } else {
                alert("添加成功!");
                location.href="/getAll"
            }
        }
    });
}

</script>
</html>

product_show.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>

<!--jquery.js bootstarp.js css -->
<script type="text/javascript" src="/static/js/jquery-1.11.0.js"></script>
<script type="text/javascript" src="/static/js/bootstrap.js" ></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.0.1/css/bootstrap.css" rel="stylesheet">
<script type="text/javascript" src="/static/js/bootstrap-datetimepicker.js" charset="UTF-8"></script>
<!--<link rel="stylesheet" type="text/css" href="/static/css/bootstrap.css">-->
</head>
<body>
<div class="container">
<div class="row clearfix">
    <div class="col-md-12 column">
        <h2 class="text-info text-center">
            欢迎来到首页
        </h2>
        <div class="row clearfix">
            <div class="col-md-4 column">
                <form class="form-horizontal" role="form">
                    <div class="form-group">
                        <label for="pname" class="col-sm-2 control-label">商品名称</label>
                        <div class="col-sm-10">
                            <input type="text" class="form-control" id="pname" placeholder="请输入搜索信息"/>
                        </div>
                    </div>
                </form>
            </div>
            <div class="col-md-4 column">
                <button type="button" class="btn btn-info btn-default" onclick="searchData()">查询</button>
            </div>
            <div class="col-md-4 column">
                <button type="button" class="btn btn-default btn-success" onclick="location.href='/getInsert'">添加商品</button>
            </div>
        </div>
        <table class="table table-hover table-bordered">
            <thead>
            <tr>
                <th>
                    编号
                </th>
                <th>
                    产品名称
                </th>
                <th>
                    市场价
                </th>
                <th>
                    超市售价
                </th>
                <th>
                    商品图片
                </th>
                <th>
                    上架时间
                </th>
                <th>
                    商品描述
                </th>
                <th>
                    操作
                </th>
            </tr>
            </thead>
            <tbody id="content">

            </tbody>
        </table>
        <div style="text-align: center">
            <ul class="pagination pagination-lg" id="pagination">

            </ul>
        </div>
    </div>
</div>
</div>
</body>
<script type="text/javascript">

var currentPage = 1;
var totalPage = 1;

$(function () {
    //页面加载完毕
    loadData();
});


function loadData() {
    var pname = $("#pname").val().trim();
    $.ajax({
        url:"/list",
        type:"get",
        data:{"currentPage":currentPage,"pname":pname},
        success:function (data) {
            totalPage = data.pages;
            currentPage = data.pageNum;
            //展示商品
            showProduct(data);
            //显示页码
            showPages(data);
        }
    });
}

function searchData() {
    var pname = $("#pname").val().trim();
    $.ajax({
        url:"/list",
        type:"get",
        data:{"currentPage":currentPage,"pname":pname},
        success:function (data) {
            totalPage = data.pages;
            currentPage = data.pageNum;
            //展示商品
            showProduct(data);
            //显示页码
            showPages(data);
        }
    });
}

function showProduct(data) {
    //显示商品
    var productList = data.list;
    //清空上一次显示
    $("#content").html("");
    for(var index in productList){
        var product = productList[index];
        var html =  '<tr class="success">'+
                    '<td>'+product.pid+'</td>'+
                    '<td>'+product.pname+'</td>'+
                    '<td>'+product.marketPrice+'</td>'+
                    '<td>'+product.shopPrice+'</td>'+
                    '<td><img width="80px" src="'+product.pimage+'" alt="假装有图"></td>'+
                    '<td>'+product.pdate+'</td>'+
                    '<td>'+product.pdesc+'</td>'+
                    '<td><button type="button" class="btn btn-danger  btn-sm" onclick="getUpdate('+product.pid+')">修改</button>'+
                    '<button type="button" class="btn btn-danger  btn-sm" onclick="delProduct('+product.pid+')">删除</button></td>'+
                    '</tr>';
        $("#content").append(html);
    }
}


function showPages() {
    //显示页码
    var $pagination = $("#pagination");
    //清空导航条内容
    $pagination.html("");
    $pagination.append(
        '<li class="'+(currentPage==1?"disabled":"")+'">'+
        '<a href="javascript:void(0)" onclick="prePage('+(currentPage-1)+')" aria-label="上一页">'+
        '<span aria-hidden="true">&laquo;</span>'+
        '</a></li>'
    );
    for (var index = currentPage - 1;index <= currentPage + 1;index++){
        if (0 < index && index < totalPage+1){
            $pagination.append('<li class="'+(currentPage==index?"active":"")+'"><a href="javascript:void(0)" onclick="indexPage('+index+')">'+index+'</a></li>')
        }
    }
    $pagination.append(
        '<li class="'+(currentPage==totalPage?"disabled":"")+'">'+
        '<a href="javascript:void(0)" onclick="nextPage('+(currentPage+1)+')" aria-label="下一页">'+
        '<span aria-hidden="true">&raquo;</span>'+
        '</a></li>'
    );
}

function prePage() {
    if (currentPage <= 1){
        alert("已经是第一页了!")
    } else{
        currentPage-=1;
        loadData();
    }
}

function nextPage() {
    if (currentPage >= totalPage){
        alert("已经是最后一页了!")
    } else{
        currentPage+=1;
        loadData();
    }
}

function indexPage(index) {
    if (index < 1 || index >totalPage){
        alert("页码不合理!")
    } else{
        currentPage = index;
        loadData();
    }
}

 function delProduct(pid) {
   $.ajax({
       url:"/delete",
       type:"post",
       data:{"pid":pid},
       dataType:"json",
       success:function (data) {
           if (data.code === 0){
               alert("删除失败!");
               location.href="/getAll";
           } else {
               alert("删除成功!");
               location.href="/getAll";
           }
       }
   });
}

 function getUpdate(pid) {
   location.href="/getUpdate?pid="+pid;
 }

</script>
</html>

product_update.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>修改</title>
<script type="text/javascript" src="/static/js/jquery-1.11.0.js"></script>
<script type="text/javascript" src="/static/js/bootstrap.js" ></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.0.1/css/bootstrap.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row clearfix">
    <div class="col-md-12 column">
        <h3 class="text-success" style="text-align: center">
            修改商品
        </h3>
        <form class="form-horizontal" role="form" id="form">
            <input type="hidden" class="form-control" id="pid" name="pid"/>
            <div class="form-group">
                <label for="pname" class="col-sm-2 control-label">商品名称</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="pname" name="pname"/>
                </div>
            </div>
            <div class="form-group">
                <label for="marketPrice" class="col-sm-2 control-label">市场价</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="marketPrice" name="marketPrice"/>
                </div>
            </div>
            <div class="form-group">
                <label for="shopPrice" class="col-sm-2 control-label">超市售价</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="shopPrice" name="shopPrice" />
                </div>
            </div>
            <div class="form-group">
                <label for="pimage" class="col-sm-2 control-label">图片</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="pimage" name="pimage"/>
                </div>
            </div>
            <div class="form-group">
                <label for="pdate" class="col-sm-2 control-label">上架日期</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="pdate" name="pdate"/>
                    <span style="color: red">yyyy-MM-dd HH:mm:ss</span>
                </div>
            </div>
            <div class="form-group">
                <label for="pdesc" class="col-sm-2 control-label">商品描述</label>
                <div class="col-sm-10">
                    <input type="text" class="form-control" id="pdesc" name="pdesc"/>
                </div>
            </div>
            <div class="form-group">
                <div class="col-sm-offset-2 col-sm-10">
                    <button type="button" class="btn btn-default" onclick="update()">修改</button>
                    <button type="button" onclick="history.back();" class="btn btn-success">返回</button>
                </div>
            </div>
        </form>
    </div>
</div>
</div>
</body>
<script type="text/javascript">

$(function () {
    $.ajax({
        url:"/getProduct",
        type:"get",
        dataType:"json",
        success:function (data) {
           $("#pid").val(data.pid);
           $("#pname").val(data.pname);
           $("#marketPrice").val(data.marketPrice);
           $("#shopPrice").val(data.shopPrice);
           $("#pimage").val(data.pimage);
           $("#pdate").val(data.pdate);
           $("#pdesc").val(data.pdesc);
        }
    });
});

function update() {
    var data = $("#form").serialize();
    var pid = $("#pid").val();
    $.ajax({
        url:"/update",
        type:"post",
        data:data,
        dataType:"json",
        success:function (data) {
            if (data.code === 0){
                alert("修改失败!");
                location.href="/getUpdate?pid="+pid;
            } else {
                alert("修改成功!");
                location.href="/getAll";
            }
        }
    });
}

</script>
</html>

WEB-INF-web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
     version="3.1">

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext-mapper.xml,
        classpath:applicationContext-service.xml,
        classpath:applicationContxt-shiro.xml
    </param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

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

<servlet>
    <servlet-name>ds</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext-mvc.xml</param-value>
    </init-param>

    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>ds</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

</web-app>

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.dong</groupId>
<artifactId>ReviewSSM</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>

<properties>
    <!-- 版本号 -->
    <spring.version>4.3.25.RELEASE</spring.version>
    <shiro.version>1.2.2</shiro.version>
</properties>

<dependencies>

    <!-- ioc/di -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-expression</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <!-- spring-aop -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>aopalliance</groupId>
        <artifactId>aopalliance</artifactId>
        <version>1.0</version>
    </dependency>

    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.10</version>
    </dependency>

    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>3.2.4</version>
    </dependency>

    <!--spring tx-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <!--web项目-->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
    </dependency>

    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2</version>
    </dependency>

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

    <!-- spring 整合web项目 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <!-- springmvc -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <!-- json -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.8.9</version>
    </dependency>

    <!-- 文件上传 -->
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.1</version>
    </dependency>

    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
    </dependency>

    <!-- 数据库相关 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.48</version>
    </dependency>

    <dependency>
        <groupId>c3p0</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.1.2</version>
    </dependency>

    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>

    <!-- 缓存 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-ehcache</artifactId>
        <version>1.0.0</version>
    </dependency>

    <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache-core</artifactId>
        <version>2.6.5</version>
    </dependency>

    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>5.1.3</version>
    </dependency>

    <!-- mybatis整合spring -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>1.3.2</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.4.1.Final</version>
    </dependency>

    <!-- lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.10</version>
    </dependency>

    <!-- shiro相关依赖 -->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-core</artifactId>
        <version>${shiro.version}</version>
    </dependency>

    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-web</artifactId>
        <version>${shiro.version}</version>
    </dependency>

    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-ehcache</artifactId>
        <version>${shiro.version}</version>
    </dependency>

    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring</artifactId>
        <version>${shiro.version}</version>
    </dependency>

    <!-- Junit4-test -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.*</include>
            </includes>
        </resource>

        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.*</include>
            </includes>
        </resource>
    </resources>
</build>
</project>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值